Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XSL-T / Die XSLT - Struktur / xsl:merge

xsl:merge

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.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/xsl_merge.html