Announcement

Collapse
No announcement yet.

XML zu XML mit Hilfe von XSLT

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XML zu XML mit Hilfe von XSLT

    Hallo,

    ich habe ein paar Schwierigkeiten mit der Transformation einer XML Datei.

    Ich bekomme erstmal eine XML-Datei (die aus einer xls erzeugt wurde), die ungefähr so aufgebaut ist:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <Interface IFName="XMLTOXML" SourcePath="D:\tmp" FileName="bla.xls" FromSystem="Excel" FromSubSystem="" DestinationPath="" ToSystem="DDI" ToSubSystem="XML" createdBy="DDIAdmin" createdTS="2008-05-20T18:33:58+02:00">
      <Worksheets>
        <Worksheet name="sheet1" id="1">
          <Row id="0" wsName="sheet1">
            <Col id="0"><![CDATA[sheet1]]></Col>
          </Row>
        ...
          <Row id="8" wsName="sheet1">
            <Col id="0"><![CDATA[sheet1]]></Col>
            <Col id="1"><![CDATA[Term]]></Col>
          </Row>
        </Worksheet>
      </Worksheets>
    </Interface>
    Nun möchte ich diese Datei mit Saxon in eine andere XML Datei transformieren.
    Mein Aufruf sieht wie folgt aus:
    Code:
    ..\exe\saxon\bin\Transform.exe ..\xml\xml_dummy.xml ..\xslt\trans.xslt OrgFile=bla.xml
    So, nun sitze ich aber da und komme nicht so richtig auf den Anfang meiner trans.xslt.
    Solange ich feste Werte in die neue Dateie transformiere funktioniert es.
    Z.B. so:

    Code:
      <xsl:template match="/">
        <xsl:result-document href="{concat($TgtBase,$TgtFile)}">
         <xsl:element name="Name">
            Horst
         </xsl:element>
        </xsl:result-document>
      </xsl:template>
    Sobald ich aber versuche, Daten aus der ersten XML in die zweite zu bekommen, klappt es irgendwie nicht.

    Könnt ihr mir da helfen? Vielleicht mit ein oder Zwei Beispielen?
    Schön wäre erstmal zu wissen, wie man z.B. Workesheets (oder ein bestimmtes) in das neue XML bekommt.
    Oder aber das Value von Row id="8" / Col id="1"

    Vielen Dank schonmal in Vorraus.

    Gruß, Andy

  • #2
    Die Grundlagen vermittelt dieses Tutorial aus dem SELFHTML-Angebot.

    An die id-Attributwerte kommt man formal so heran:
    /Interface/Worksheets/Worksheet/Row[1]/@id --> 0
    /Interface/Worksheets/Worksheet/Row[1]/Col[1]/@id --> 0

    Bei mehrfachen Abfragen würde sich eher xsl:apply-templates oder xsl:for-each anbieten.
    Zuletzt editiert von Thomas Meinike; 28.05.2008, 21:06.

    Comment


    • #3
      Hi, danke schonmal für die Antwort.
      In deinen Beispielen zählt er aber einfach die Rows und Cols von oben und gibt mir die id zurück, oder? Wie würde es denn aussehen, wenn ich den Value von dem Element haben möchte, wo die Row id = 8 und die Col id = 1 ist?

      Ist schon ne Zeit her, aber eigentlich hab ich schonmal erfolgreich etwas mit xslt gemacht. Irgendwie hatte ich heute aber das Gefühl, dass er sich innerhalb des <xslt:result-document...> anders verhält :-/

      Mit apply-templates und for-each hab ich heute meine Versuche auch gestartet, was leider nicht geklappt hat.

      Wie müsste denn das select im for-each aussehen, wenn ich alle worksheets durchlaufen möchte? und wie greif ich dann innerhalb des for-each auf die jeweiligen Werte zu?

      Kann mir vielleicht auch noch jemand sagen, wozu das dummy-xml genau nötig ist?

      Comment


      • #4
        Der Inhalt "Term" ergibt sich z. B. durch:
        Code:
        <xsl:template match="/">
          <xsl:value-of select="//Row[@id='8']/Col[@id='1']/node()"/>
        </xsl:template>
        Die Col-Inhalte ergeben sich so:
        Code:
        <xsl:template match="Interface">
          <root>
            <xsl:apply-templates select="Worksheets"/>
          </root>
        </xsl:template>
        
        <xsl:template match="Worksheets">
          <xsl:apply-templates select="Worksheet"/>
        </xsl:template>
        
        <xsl:template match="Worksheet">
          <xsl:apply-templates select="Row"/>
        </xsl:template>
        
        <xsl:template match="Row">
          <xsl:apply-templates select="Col"/>
        </xsl:template>
        
        <xsl:template match="Col">
          <output><xsl:value-of select="."/></output>
        </xsl:template>
        Ergebnis:
        Code:
        <root>
          <output>sheet1</output>
          <output>sheet1</output>
          <output>Term</output>
        </root>
        Versuche XSLT und XPath zu verstehen, das genannte Tutorial hat sich bewährt. Wo kommt dieses "dummy-xml" vor? Meinst Du "dummy.xml" aus meinen Beispielen? Dieses ist zur Demonstration von XSLT/XPath-Funktionen gedacht, ohne auf XML-Daten zuzugreifen. Zur Transformation wird dennoch ein minimaler XML-Tree benötigt, um überhaupt ein Template verarbeiten zu können.

        Comment


        • #5
          Aaahhh, ok. Jetzt seh ich, wo ich in die falsche Richtung gedacht habe.
          Vielen Dank für die Mühe, hast mir sehr geholfen.

          Gruß, Andy

          Comment


          • #6
            Hallo nochmal,

            ansich hat alles gut geklappt, jetzt hab ich jedoch noch 2 inhaltliche Fragen.

            Fall1:

            Ich habe ja in meinem Ausgangs-XML mehrere Worksheets abgebildet. Nun muss ich eines dieser Worksheets auslesen und transformieren. Das Problem ist, dass ich vorher noch nicht weiß, welches Worksheet das sein wird. Dies ist abhängig vom Inhalt. Die Worksheets enthalten beliebig viele Positionen, die bestimmte Werte haben müssen.
            Nun hab ich mein XSLT soweit, dass ich mit einer Schleife das richtige Worksheet finde. An der Stelle hab ich jetzt aber das Problem, dass ich von dort nicht wieder zurückkomme, da man ja in xslt keine Variablen mehrfach setzen kann. Mit param hab ichs auch versucht, aber das mag er an der Stelle anscheinend auch nicht.
            Nochm mal auf den Punkt: Mein xslt durchsucht das xml, findet in einer for-each das zutreffenden Worksheet und muss dieses nun von Anfang an auslesen. Also theoretisch mit dem zutreffenden Worksheet-Namen wieder aus der Schleife raus und am Worksheet-Anfang wieder los.

            Fall2:

            Mein erzeugtes XML ist noch sehr unübersichtlich, weil keine Zeilenumbrüche drin sind. Wie bekomme ich die da rein?

            Vielen Dank im Voraus,

            Andy

            Comment

            Working...
            X