Hallo,
Ich habe ein Dokument, das verschiedene Tabellen mit Datensätzen enthält und möchte dieses in ein anderes Format übertragen.
Das Eingangsformat sieht grob so aus:
<dataset>
<Table1>
<col1>Wert a</col1>
<col2>Wert b</col2>
<col3>Wert c</col3>
</Table1>
<Table1>
<col1>Wert d</col1>
<col2>Wert e</col2>
<col3>Wert f</col2>
</Table1>
<Tabelle2>
<col1>Wert g</col1>
<col2>Wert h</col2>
</Tabelle2>
</dataset>
Das Problem das ich mit diesem Format habe ist, dass Tabellen und Rows sozusagen in einem einzigen Tag ausgedrückt werden und nicht in zwei.
So ist es nämlich im Ausgangsformat:
<Worksheet>
<table>
<row>
<cell></cell>
</row>
<table>
</Worksheet>
Ich muss jetzt sozusagen pro Gruppe gleichnamiger Childelemente von Dataset jeweils einmal die XML-Tags Worksheet und table ausgeben.
Wie kann ich so eine Gruppe "matchen"? Oder muss ich das anders angehen?
Ich kann übrigens nicht XSLT2.0 verwenden, es muss also irgendwie mit 1.0 lösbar sein.
Kann mir jemand helfen?
Programmieren - alles kontrollieren 4.935 Themen, 20.621 Beiträge
Ich habe heute noch einmal eine Weile herumprobiert und schliesslich doch noch eine dynamische Lösung gefunden :)
<xsl:stylesheet version="1.0"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
<xsl:key name="Tables" match="/*/*" use="local-name(.)" />
<xsl:template match="/">
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:html="" target="_blank" rel="nofollow">http://www.w3.org/TR/REC-html40">
<Styles>
<Style ss:ID="s21">
<NumberFormat ss:Format="0"/>
</Style>
</Styles>
<xsl:for-each select="/*/*[not(local-name() = local-name(./following-sibling::*))]">
<xsl:variable name="tablename" select="local-name()" />
<Worksheet ss:Name="{$tablename}">
<Table x:FullColumns="1" x:FullRows="1">
<Row>
<xsl:for-each select="key('Tables', $tablename)[position() = 1]/*">
<Cell>
<Data ss:Type="String">
<xsl:value-of select="local-name(.)"/>
</Data>
</Cell>
</xsl:for-each>
</Row>
<xsl:apply-templates select="key('Tables', $tablename)"/>
</Table>
</Worksheet>
</xsl:for-each>
</Workbook>
</xsl:template>
<xsl:template match="/*/*">
<Row>
<xsl:apply-templates/>
</Row>
</xsl:template>
<xsl:template match="GESICHERTEGB">
<Cell ss:StyleID="s21">
<Data ss:Type="Number">
<xsl:value-of select="."/>
</Data>
</Cell>
</xsl:template>
<xsl:template match="MASTERSERVER | SICHERUNGSTYP | F7 | HALTEFRIST | JOBID | F15 | F16 | F17 | F18 | F19 | Haltezeit | SummeMonat">
<Cell>
<Data ss:Type="Number">
<xsl:value-of select="."/>
</Data>
</Cell>
</xsl:template>
<xsl:template match="STARTSICHERUNG | ENDESICHERUNG | MASTERSERVER |SICHERUNGSTYP | NETBACKUPCLIENT | SICHERUNGSART
| MEDIASERVER | POLICY | SCHEDULE | LAUFWERK">
<Cell>
<Data ss:Type="String">
<xsl:value-of select="."/>
</Data>
</Cell>
</xsl:template>
</xsl:stylesheet>