XML | XML-Schema | XPath | XSL-T | XSL-FO | XQuery | XProc | SVG |
XSL-T / Die XSLT - Struktur / xsl:merge
![]() |
![]() |
➪ xsl:merge erlaubt, die Inhalte diverser xsl:merge-source mit xsl:merge-key in eine Sequenz zu mergen. In der xsl:merge-action kann jedes einzelne Item der current-merge-group() angesprochen werden; dabei ist der jeweilige merge-key durch current-merge-key() erreichbar.
Siehe
Nehmen Sie an, Sie haben mehrere einzelne Dokumente mit unterschiedlichem Inhalt, aber identischem Aufbau. Der Inhalt kann beispielsweise so aussehen:
<Mensch>
<id>5</id>
<name>Wunschlos</name>
<vorname>Wilma</vorname>
<Gehalt>6789</Gehalt>
<idOrt>3</idOrt>
<Kauf>
<idMensch>5</idMensch>
<anzahl>4</anzahl>
<bez>Hemd</bez>
<preis>12.99</preis>
<Gesamt>51.96</Gesamt>
</Kauf>
<Kauf>
<idMensch>5</idMensch>
<anzahl>44</anzahl>
<bez>Hemd</bez>
<preis>12.99</preis>
<Gesamt>571.56000000000006</Gesamt>
</Kauf>
<Kauf>
<idMensch>5</idMensch>
<anzahl>3</anzahl>
<bez>Hose</bez>
<preis>25.99</preis>
<Gesamt>77.97</Gesamt>
</Kauf>
<Kauf>
<idMensch>5</idMensch>
<anzahl>5</anzahl>
<bez>Hose</bez>
<preis>25.99</preis>
<Gesamt>129.95</Gesamt>
</Kauf>
</Mensch>
Nun geht es darum, diese externen Dokumente in einer geschlossene Sequenz abzubilden und auszuwerten. Hier stehen xsl:merge und dessen Childnodes xsl:merge-source und xsl:merge-action zur Verfügung.
Der xsl:merge-key weist mehrere Attribute auf.
Das eigentliche XSL-Stylesheet hat dann diesen Aufbau:
<xsl:template match="/">
<root>
<xsl:merge>
<xsl:merge-source
for-each-source="'../test/__1.xml',
'../test/__2.xml'"
select="/Mensch/Kauf">
<xsl:merge-key select="idMensch"/>
</xsl:merge-source>
<xsl:merge-source
for-each-source="'../test/__3.xml',
'../test/__3a.xml'"
select="/Mensch/Kauf">
<xsl:merge-key select="idMensch"/>
</xsl:merge-source>
<xsl:merge-source
for-each-source="'../test/__4.xml',
'../test/__5.xml'"
select="/Mensch/Kauf">
<xsl:merge-key select="idMensch"/>
</xsl:merge-source>
<xsl:merge-action>
<xsl:for-each
select="current-merge-group()">
<Einkauf
mergekey="{current-merge-key()}"
Ware="{bez}"
Umsatz="{xs:integer(anzahl) * xs:decimal(preis)}"/>
</xsl:for-each>
</xsl:merge-action>
</xsl:merge>
</root>
</xsl:template>
Statt die einzelnen Quelldateien mit xsl:merge-source und for-each-source separat aufzulisten, können Sie auch mit der collection-Funktion arbeiten.
<xsl:merge-source
for-each-item="collection(
'../output?select=__*.xml;recurse=no;')"
select="/Mensch/Kauf">
<xsl:merge-key select="idMensch"/>
</xsl:merge-source>
xsl:merge kann mehrere Childnodes xsl:merge-source aufweisen; am Schluss steht xsl:merge-action zur Verfügung. Letztere kann über eine simple Schleife über die gesamte current-merge-group() abgearbeitet werden; hierbei können Sie mit current-merge-key() auch auf den einzelnen xsl:merge-key zugreifen.
Das Ergebnis ist nachvollziehbar:
<root>
<Einkauf mergekey="1" Ware="Hemd" Umsatz="38.97"/>
<Einkauf mergekey="1" Ware="Hemd" Umsatz="116.91"/>
<Einkauf mergekey="1" Ware="Hemd" Umsatz="103.92"/>
<Einkauf mergekey="1" Ware="Hose" Umsatz="233.91"/>
<Einkauf mergekey="1" Ware="Hose" Umsatz="233.91"/>
<Einkauf mergekey="1" Ware="Hose" Umsatz="207.92"/>
<Einkauf mergekey="1" Ware="Hose" Umsatz="207.92"/>
<Einkauf mergekey="1" Ware="Schuhe" Umsatz="1209.84"/>
<Einkauf mergekey="1" Ware="Schuhe" Umsatz="1209.84"/>
<Einkauf mergekey="2" Ware="Hemd" Umsatz="90.93"/>
<Einkauf mergekey="2" Ware="Hose" Umsatz="181.93"/>
<Einkauf mergekey="2" Ware="Hose" Umsatz="181.93"/>
<Einkauf mergekey="2" Ware="Hose" Umsatz="181.93"/>
<Einkauf mergekey="2" Ware="Schuhe" Umsatz="1058.61"/>
<Einkauf mergekey="2" Ware="Schuhe" Umsatz="1058.61"/>
<Einkauf mergekey="3" Ware="Hemd" Umsatz="25.98"/>
<Einkauf mergekey="3" Ware="Hemd" Umsatz="103.92"/>
<Einkauf mergekey="3" Ware="Hemd" Umsatz="51.96"/>
<Einkauf mergekey="3" Ware="Hose" Umsatz="233.91"/>
<Einkauf mergekey="3" Ware="Hose" Umsatz="77.97"/>
<Einkauf mergekey="3" Ware="Schuhe" Umsatz="907.38"/>
<Einkauf mergekey="3" Ware="Schuhe" Umsatz="756.15"/>
<Einkauf mergekey="3" Ware="Schuhe" Umsatz="302.46"/>
<Einkauf mergekey="3" Ware="Schuhe" Umsatz="151.23"/>
<Einkauf mergekey="3" Ware="Hut" Umsatz="25.98"/>
<Einkauf mergekey="3" Ware="Hut" Umsatz="103.92"/>
<Einkauf mergekey="3" Ware="Hut" Umsatz="51.96"/>
<Einkauf mergekey="3" Ware="Hose" Umsatz="233.91"/>
<Einkauf mergekey="3" Ware="Hose" Umsatz="77.97"/>
<Einkauf mergekey="3" Ware="Mantel" Umsatz="907.38"/>
<Einkauf mergekey="3" Ware="Mantel" Umsatz="756.15"/>
<Einkauf mergekey="3" Ware="Mantel" Umsatz="302.46"/>
<Einkauf mergekey="3" Ware="Mantel" Umsatz="151.23"/>
<Einkauf mergekey="4" Ware="Hose" Umsatz="207.92"/>
<Einkauf mergekey="4" Ware="Hose" Umsatz="181.93"/>
<Einkauf mergekey="4" Ware="Hose" Umsatz="155.94"/>
<Einkauf mergekey="4" Ware="Hose" Umsatz="129.95"/>
<Einkauf mergekey="4" Ware="Hose" Umsatz="103.96"/>
<Einkauf mergekey="4" Ware="Hose" Umsatz="103.96"/>
<Einkauf mergekey="4" Ware="Hose" Umsatz="77.97"/>
<Einkauf mergekey="5" Ware="Hemd" Umsatz="51.96"/>
<Einkauf mergekey="5" Ware="Hemd" Umsatz="571.56"/>
<Einkauf mergekey="5" Ware="Hose" Umsatz="77.97"/>
<Einkauf mergekey="5" Ware="Hose" Umsatz="129.95"/>
</root>
wg / 10. August 2020
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de