2016-06-29 12 views
0

Meine Quelle XML sieht wie folgt aus:XSLT: Gruppe verschiedene Elementtypen

<A> 
    <item> 
    <X>10</X> 
    <Y>20</Y> 
    <Data1>Foo</Data1> 
    </item> 
</A> 
<B> 
    <item> 
    <X>10</X> 
    <Y>20</Y> 
    <Data2>Bar</Data2> 
    </item> 
</B> 
<A> 
    <item> 
    <X>11</X> 
    <Y>20</Y> 
    <Data1>Foo2</Data1> 
    </item> 
</A> 
<B> 
    <item> 
    <X>11</X> 
    <Y>20</Y> 
    <Data2>Bar2</Data2> 
    </item> 
</B> 

Beachten Sie, dass A s und B s immer paarweise in Bezug auf die Werte von X und Y auftreten. Beachten Sie auch, dass es auch andere Elemente gibt, die ein verschachteltes item Element enthalten, das ignoriert werden sollte. Nun, mein Ziel zu Gruppe sind die Elemente, die die gleichen Werte für X und Y in neue Elemente, die wie folgt aussehen:

<NewElement> 
    <X>10</X> 
    <Y>20</Y> 
    <Data1>Foo</Data1> 
    <Data2>Bar</Data2> 
</NewElement> 
<NewElement> 
    <X>11</X> 
    <Y>20</Y> 
    <Data1>Foo2</Data1> 
    <Data2>Bar2</Data2> 
</NewElement> 

ich Muench-Gruppierung gelesen haben, aber es scheint, dass dies funktioniert nur für die gleichen Elemente (ZB könnte ich in meinem Beispiel alle A s mit den gleichen Werten für X und Y) gruppieren. Wie kann ich verschiedene Elemente gruppieren?

+1

Wenn ich verstehe Ihre Beschreibung richtig, das ist nicht wirklich Gruppierung. Es scheint, dass Sie nur ein 'NewElement' für jedes' A' erstellen und es mit Daten aus dem aktuellen 'A' und dem entsprechenden' B' füllen müssen. –

+0

Ich denke du hast recht - dumm mich. Ich werde meine Lösung (die wahrscheinlich etwas leichter zu verstehen ist) posten und diese annehmen - hoffe, dass Sie mit der Antwort "Antwort ist nützlich" zufrieden sind ... – csoltenborn

Antwort

0

Michael hatte Recht - keine Gruppierung für mein Problem durchführen müssen. Hier ist die Lösung, die ich am Ende mit, was wahrscheinlich ist, nicht so elegant wie die von ihm geschrieben, aber vielleicht ein bisschen leichter zu verstehen: (?)

<xsl:template match="A/item"> 
    <NewElement> 
    <X><xsl:value-of select="X"/></X> 
    <Y><xsl:value-of select="Y"/></Y> 
    <Data1><xsl:value-of select="Data1"/></Data1> 
    <Data2> 
     <xsl:variable name="localX" select="X"/> 
     <xsl:variable name="localY" select="Y"/> 
     <xsl:value-of select="../../B/item[X = $localX and Y = $localY]/Data2"/> 
    </Data2> 
    </NewElement> 
</xsl:template> 
1

Das folgende Sheet:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:key name="b" match="B/item" use="concat(X, '|', Y)" /> 

<xsl:template match="/root"> 
    <root> 
     <xsl:for-each select="A/item"> 
      <NewElement> 
       <xsl:copy-of select="*"/> 
       <xsl:copy-of select="key('b', concat(X, '|', Y))/Data2"/> 
      </NewElement> 
     </xsl:for-each> 
    </root> 
</xsl:template> 

</xsl:stylesheet> 

auf Ihre Eingabe Beispiel angewendet (! Nach einem root Element Zugabe es wohlgeformt zu machen), produziert:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <NewElement> 
     <X>10</X> 
     <Y>20</Y> 
     <Data1>Foo</Data1> 
     <Data2>Bar</Data2> 
    </NewElement> 
    <NewElement> 
     <X>11</X> 
     <Y>20</Y> 
     <Data1>Foo2</Data1> 
     <Data2>Bar2</Data2> 
    </NewElement> 
</root>