Willkommen bei Entwickler-Forum.
Ergebnis 1 bis 5 von 5
  1. #1
    Aufsteiger
    Registriert seit
    24.09.2010
    Beiträge
    91

    Standard 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. #2
    Stammgast
    Registriert seit
    12.02.2007
    Beiträge
    1.368

    Standard

    Warum nicht so beginnen?
    Code XML:
    <xsl:template match="config">
      <database name="{in}">
        <xsl:apply-templates/> <!-- ... -->
      </database>
    </xsl:template>

  3. #3
    Aufsteiger
    Registriert seit
    24.09.2010
    Beiträge
    91

    Standard

    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.
    Geändert von Vince42 (29.05.2018 um 21:21 Uhr)
    --
    Cheers Vince

  4. #4

    Standard

    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.

  5. #5
    Aufsteiger
    Registriert seit
    24.09.2010
    Beiträge
    91

    Standard

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

 

 

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •