Announcement

Collapse
No announcement yet.

XSL: Verschachtelte Elemente

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

  • XSL: Verschachtelte Elemente

    Moin,

    ich habe ein XML

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <config>
      <in>c:\temp\workbook.xlsx</in>
      <references>
        <reference>
          <worksheet>Sheet1</worksheet>
        </reference>
        <reference>
          <worksheet>Sheet 2</worksheet>
        </reference>
        <reference>
          <worksheet>Sheet1</worksheet>
          <range>A2</range>
        </reference>
        <reference>
          <worksheet>Sheet1</worksheet>
          <range mode="R1C1">R2C1</range>
        </reference>
        <reference>
          <worksheet>Sheet 2</worksheet>
          <range>A2</range>
        </reference>
        <reference>
          <worksheet>Sheet 2</worksheet>
          <range mode="R1C1">R2C1</range>
        </reference>
        <reference>
          <worksheet>Sheet1</worksheet>
          <range>A1:B2</range>
        </reference>
        <reference>
          <worksheet>Sheet1</worksheet>
          <range mode="R1C1">R1C1:R2C2</range>
        </reference>
        <reference>
          <worksheet>Sheet 2</worksheet>
          <range>A1:B2</range>
        </reference>
        <reference>
          <worksheet>Sheet 2</worksheet>
          <range mode="R1C1">R1C1:R2C2</range>
        </reference>
        <reference>
          <name>Table2</name>
        </reference>
        <reference>
          <table>Table</table>
          <name>Name</name>
        </reference>
        <reference>
          <table>Table</table>
          <name>Code:Name</name>
        </reference>
        <reference>
          <table>Table</table>
          <name>#All</name>
        </reference>
        <reference>
          <table>Table</table>
          <name>#Data</name>
        </reference>
        <reference>
          <table>Table</table>
          <name>#Headers</name>
        </reference>
        <reference>
          <table>Table</table>
          <name>#Totals</name>
        </reference>
        <reference>Table[[ID],[#All]]</reference>
      </references>
      <out>x:\output\data.xml</out>
    </config>
    und möchte dies in ein anderes XML transformieren, das ähnlich dem folgenden Muster sein soll

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <database name="Test.xlsx">
      <table name="Table One">
        <list name="ID">
          <item>1</item>
          <item>2</item>
          <item>3</item>
        </list>
        <list name="Code">
          <item>A</item>
          <item>B</item>
          <item>C</item>
        </list>
        <list name="Name">
          <item>Angola</item>
          <item>Barbeidos</item>
          <item>Chile</item>
        </list>
      </table>
      <table name="Table Two">
        <list name="ID">
          <item>4</item>
          <item>5</item>
          <item>6</item>
        </list>
        <list name="Code">
          <item>D</item>
          <item>E</item>
          <item>F</item>
        </list>
        <list name="Name">
          <item>Duffy</item>
          <item>Elisa</item>
          <item>Fred</item>
        </list>
      </table>
      <table name="Table Two">
        <list name="ID">
          <item>7</item>
          <item>8</item>
          <item>9</item>
        </list>
        <list name="Code">
          <item>G</item>
          <item>H</item>
          <item>I</item>
        </list>
        <list name="Name">
          <item>Germanium</item>
          <item>Halogen</item>
          <item>Iridium</item>
        </list>
      </table>
    </database>
    Mein bisheriges XSL sieht so aus:

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
    
      <xsl:output method="xml" encoding="utf-8" indent="yes"/>
    
      <xsl:variable name="Workbook" select="xl/workbook.xml"/>
    
      <xsl:template match="config">
        <xsl:apply-templates/>
      </xsl:template>
    
      <xsl:template match="in">
        <xsl:element name="database">
          <xsl:attribute name="name">
            <xsl:value-of select="."/>
          </xsl:attribute>
          <xsl:apply-templates select="references"/>
        </xsl:element>
      </xsl:template>
      
      <xsl:template match="references">
        <xsl:apply-templates select="reference"/>
      </xsl:template>
      
      <xsl:template match="reference">
        <xsl:element name="table">
          <xsl:attribute name="name">NAME</xsl:attribute>
          <xsl:apply-templates/>
        </xsl:element>
      </xsl:template>
      
      <xsl:template match="worksheet">
        
      </xsl:template>
      
      <xsl:template match="table">
        
      </xsl:template>
      
      <xsl:template match="range">
        
      </xsl:template>
      
      <xsl:template match="name">
        
      </xsl:template>
      
      <xsl:template match="out">
        <!-- ... -->
      </xsl:template>
    
    </xsl:stylesheet>
    Als Resultat erhalte ich

    Code:
    <?xml version="1.0" encoding="utf-8"?>
      <database name="c:\temp\workbook.xlsx"/>
      <table name="NAME">
        </table>
    <table name="NAME">
        </table>
        <!-- usw -->
    Primär irritiert mich, warum das database-Element geschlossen wird. Ich dachte, daß ich verschachtelte Elemente erzeugen kann, wenn ich xsl:apply-templates innerhalb des Elementes aufrufe. Ich könnte das Problem sicherlich übergehen, indem ich die Elemente und Attribute als Textstrings zusammensetze, fände es aber schöner (und logischer), wenn ich es mit den vorgesehenen XSL-Funktionen erreichen könnte.

    Worin liegt mein Denkfehler?
    --
    Cheers Vince

  • #2
    Warum nicht so beginnen?
    [highlight=xml]<xsl:template match="config">
    <database name="{in}">
    <xsl:apply-templates/> <!-- ... -->
    </database>
    </xsl:template>[/highlight]

    Comment


    • #3
      Ja, das funktioniert natürlich. Ich habe meine Frage offenbar falsch oder zu ungenau gestellt - sorry. Ich versuche es mal anders zu formulieren: Ist es möglich mit xsl:element Elemente zu verschachteln? Wenn ja: was habe desbezüglich in dem oa Template falsch gemacht? Zumal es im table-Element zu funktionieren scheint.
      Zuletzt editiert von Vince42; 29.05.2018, 21:21.
      --
      Cheers Vince

      Comment


      • #4
        Das "in"-Element hat doch gar keine "references"-Kindelement, also macht das apply-templates select="references" im Template für "in" gar nichts. Und das apply-templates eine Ebene höher verändert natürlich nicht die Struktur, sondern transformiert das "in"-Element und die "references"-Elemente und erzeugt die Ausgabe mit derselben Struktur und Schachtelung wie im Eingabedokument.

        Comment


        • #5
          Vielen Dank! Jetzt habe ich es verstanden - und gefixt.
          --
          Cheers Vince

          Comment

          Working...
          X