Wende: Einzelne Daten aus XML Katalog in eigene XML Datei extrahieren

Hallo,
ich habe folgendes Problem: Aus einem XML Katalog soll ich einzelne Bilddaten extrahieren und für jedes Bild dabei eine neue XML Datei erstellen. Da es sich um mehrere tausend Bilder handelt ist es etwas unpraktisch diese Daten manuell zu extrahieren, Stapelverarbeitung wäre also ganz schön. Hat jemand hierfür einen Softwaretip oder sonst eine Idee, wie das möglich ist?
Vielen Dank,
Wende

  1. Hallo Wende,

    ich habe folgendes Problem: Aus einem XML Katalog soll ich einzelne Bilddaten extrahieren und für jedes Bild dabei eine neue XML Datei erstellen.

    wenn XSLT und speziell die Version 2.0 eine Option ist (also Verarbeitung mit Prozessoren wie Saxon, AltovaXML, Gestalt) wäre das neue Element xsl:result-document hilfreich, welches über das href-Attribut beliebig viele Ausgabedokumente erzeugen kann (z. B. innerhalb eines xsl:for-each-Konstruktes).

    Grüße,
    Thomas

    1. Das sieht mir zwar nach ziemlich viel arbeit aus, aber ich glaub, so komm ich weiter. Ich werds mal mit Altova probieren.
      Vielen Dank!

      1. Hallo Wende,

        Das sieht mir zwar nach ziemlich viel arbeit aus, aber ich glaub, so komm ich weiter. Ich werds mal mit Altova probieren.

        Der Gesamtaufwand richtet sich natürlich nach der Komplexität des XML-Dokuments, aber die eigentliche Ausgabe der erzeugten Dokumente mittels xsl:result-document ist relativ einfach zu realisieren. Hier mal ein Prinzipbeispiel:

        XML-Datenbasis:

        <?xml version="1.0" encoding="UTF-8"?>  
        <daten_eingabe>  
          <daten>Text 1</daten>  
          <daten>Text 2</daten>  
          <daten>Text 3</daten>  
          <daten>Text 4</daten>  
          <daten>Text 5</daten>  
        </daten_eingabe>
        

        XSLT-Stylesheet:

        <?xml version="1.0" encoding="UTF-8"?>  
        <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
          
          <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" name="xml_ausgabe"/>  
          
          <xsl:template match="daten_eingabe">  
            <xsl:apply-templates/>  
          </xsl:template>  
          
          <xsl:template match="daten">  
            <xsl:result-document format="xml_ausgabe" href="ausgabe{position()}.xml">  
              <daten_ausgabe>  
                <daten>  
                  <xsl:value-of select="."/>  
                </daten>  
              </daten_ausgabe>  
            </xsl:result-document>  
          </xsl:template>  
          
        </xsl:stylesheet>
        

        Ergebnis in Form von ausgabe1.xml ... ausgabe5.xml in der Form:

        <?xml version="1.0" encoding="UTF-8"?>  
        <daten_ausgabe>  
         <daten>Text 1</daten>  
        </daten_ausgabe>
        

        ...

        <?xml version="1.0" encoding="UTF-8"?>  
        <daten_ausgabe>  
         <daten>Text 5</daten>  
        </daten_ausgabe>
        

        Transformation mit AltovaXML 2008:
        pfad_zu/altovaxml(.exe) -xslt2 stylesheet.xsl -in dokument.xml

        Alternativ mit Saxon 9.0B:
        java -jar pfad_zu/saxon9.jar dokument.xml stylesheet.xsl

        (Ausgabeparameter -out bzw. -o werden nicht benötigt, da die Ergebnisse direkt in Dateien geschrieben werden.)

        Grüße,
        Thomas

        1. Hellihello

          in php:

            
            
          <?php  
            
          $xml_string='<?xml version="1.0" encoding="UTF-8"?>  
          <daten_eingabe>  
             <daten>Text 1</daten>  
             <daten>Text 2</daten>  
            <daten>Text 3</daten>  
             <daten>Text 4</daten>  
             <daten>Text 5</daten>  
           </daten_eingabe>';  
            
          $sxo = simplexml_load_string($xml_string);  
            
          foreach ($sxo as $daten_node) {  
           file_put_contents ($daten_node, $daten_node . "some additional text in file");  
           echo $daten_node . "written to file \n";  
          }  
          ?>  
            
          
          

          (tested)

          Dank und Gruß,

          frankx

          --
          tryin to multitain  - Globus = Planet != Welt
          1. Ich habe jetzt beide Möglichkeiten ausprobiert. PHP war nie mein Ding und das XSLT sieht für mich ganz verständlich aus. Ich glaube außerdem das sich die Menge an Daten damit besser verarbeiten lassen. Trotzdem ganz lieben herzlichen Dank für den Tipp!
            Thomas, kennst du ein gutes Tutorial zum Erstellen von XSLT Stylesheets? Die Ausgangsdatenbank ist nämlich ziemlich kompliziert und es sind einige Daten zu extrahieren.
            Vielen Dank, Gruß,
            Wende

            1. Hallo Wende,

              Thomas, kennst du ein gutes Tutorial zum Erstellen von XSLT Stylesheets? Die Ausgangsdatenbank ist nämlich ziemlich kompliziert und es sind einige Daten zu extrahieren.

              In SELFHTML werden bereits die nötigen XSLT/XPath 1.0-Grundlagen beschrieben. Eine Zusammenfassung der vielfältigen Neuerungen von XSLT 2.0 und XPath 2.0 (wie xsl:result-document) enthält diese Vortragspräsentation (PDF).

              Grüße,
              Thomas

              1. Hallo Thomas,

                Ich habe jetzt mit dem Stylesheet angefangen und stehe schon wieder vor einem Problem: Die Funktion "xsl:result-document" wird in den Selfhtml Grundlagen noch nicht erwähnt und in deinem, trotzdem sehr hilfreichen, Vortrag leider auch nicht in dem Umfang in dem ich sie brauche:
                Ich will eine Information die in der Quelldatei steht in den Namen der neuen Datei importieren. es steht also in der Quelle unter <Filename> 23532.tif und die neue XML sollte heißen 23532.tif.xml.
                Glaubst du das ist irgendwie möglich?

                Lieben Gruß,
                Wende

                1. Hallo Wende,

                  Ich will eine Information die in der Quelldatei steht in den Namen der neuen Datei importieren. es steht also in der Quelle unter <Filename> 23532.tif und die neue XML sollte heißen 23532.tif.xml.
                  Glaubst du das ist irgendwie möglich?

                  Kommt auf die tatsächliche Referenzierung im Template an, aber im Grunde sollte es so funktionieren:

                  <xsl:result-document href="{Filename}.xml">  
                  ...  
                  </xsl:result-document>
                  

                  Grüße,
                  Thomas

                  1. Kommt auf die tatsächliche Referenzierung im Template an, aber im Grunde sollte es so funktionieren:

                    Ja, dass stimmt. Die Filenameangabe steht aber unter <MediaItem><Accessories><Filename>

                    Ich bin leider noch kein Profi; Wie kann ich das angeben?

                    Nochmal danke für die ganzen Mühen,
                    Wende

                    1. Hallo Wende,

                      Ja, dass stimmt. Die Filenameangabe steht aber unter <MediaItem><Accessories><Filename>

                      Ich bin leider noch kein Profi; Wie kann ich das angeben?

                      Zeige mal ein relevantes Stück vom XML-Code. Davon hängt die Template-Hierarchie ab.

                      Grüße,
                      Thomas

                      1. <MediaItem>
                         <AssetProperties>
                          <Filename>319110100020a 033.tif</Filename>
                          <Filepath>Macintosh HD (...) 319110100020a 033.tif</Filepath>
                          <OriginalSource>Originals_(Katalog-1):319110100020a 033.tif</OriginalSource>
                          <UniqueID>1</UniqueID>
                          <Label>0</Label>
                          <Rating>0</Rating>
                          <MediaType>TIFF</MediaType>
                          <FileSize unit="Bytes">18874560</FileSize>
                          <Created>2008:06:20 16:46:47</Created>
                          <Modified>2008:06:20 17:52:14</Modified>
                          <Added>2008:06:21 15:21:02</Added>
                         </AssetProperties>
                         <MetaDataFields>
                          <SourceURL></SourceURL>
                         </MetaDataFields>
                        </MediaItem>

                        1. Hallo Wende,

                          <MediaItem>
                          <AssetProperties>
                            <Filename>319110100020a 033.tif</Filename>
                          ...

                          Ansatz (erzeugt leeres XML-Dokument mit wurzel-Element und URI-konformem Dateinamen 319110100020a%20033.tif.xml):

                          <?xml version="1.0" encoding="UTF-8"?>  
                          <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
                            xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"  
                            exclude-result-prefixes="fn xs">  
                            
                            <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" name="xml_ausgabe"/>  
                            
                            <xsl:template match="/">  
                              <xsl:apply-templates/>  
                            </xsl:template>  
                            
                            <xsl:template match="MediaItem">  
                              <xsl:result-document format="xml_ausgabe" href="{fn:encode-for-uri(AssetProperties/Filename)}.xml">  
                                <wurzel>  
                                  <!-- weitere Ausgaben -->  
                                </wurzel>  
                              </xsl:result-document>  
                            </xsl:template>  
                            
                          </xsl:stylesheet>
                          

                          Nach dem Studium der genannten Quellen (speziell SELFHTML) sollten sich weitere Ausgaben umsetzen lassen.

                          Grüße,
                          Thomas

                          1. Die weiteren Angaben waren kein Problem. Bei mir musste der Link allerdings ohne das "fn:" angegeben werden.

                            Das ganze klappt jetzt echt super! Das war eine rießige Arbeitserleichterung - Ganz, ganz vielen Dank dafür!

                            Gruß, Wende

                            1. Hallo Wende,

                              Bei mir musste der Link allerdings ohne das "fn:" angegeben werden.

                              Ich hatte den fn-Namensraum beim xsl:stylesheet-Element angegeben [xmlns:fn="http://www.w3.org/2005/xpath-functions"].

                              Grüße,
                              Thomas

  2. Hellihello

    PHPs simplexml- und file-Funktionen reichen nicht aus?

    Dank und Gruß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt