2017-02-03 5 views
0

Zum Beispiel der Eingabe ist dies:Extract einzigartige Elemente aus dem Eingang XSLT

<root> 
<command name="comm1">aa</command> 
<command name="comm2">bb</command> 
<command name="comm3">cc</command> 
<command name="comm3">dd</command> 
<command name="comm2">ee</command> 
<command name="comm1">ff</command> 
<command name="comm5">gg</command> 
</root> 

Die gewünschte Ausgabe ist dies:

<root> 
<command name="comm1">aa</command> 
<command name="comm2">bb</command> 
<command name="comm3">cc</command> 
<command name="comm5">gg</command> 
</root> 

Sie können am Ausgang sehen, dass wir nicht haben, Wiederholen von Tags, die Textwerte sind hier nicht wichtig.

+0

Bitte geben Sie die XSLT-Prozessor werden Sie benutzen. –

+0

Sollte die Frage lauten "Extrahiere einzigartige Elemente aus der Eingabe-XML mit XSLT" anstelle von "Extrahiere einzigartige Elemente aus der Eingabe-XSLT"? Siehe: http://dx.doi.org/10.14337/XMLLondon17.Gibson01 – holmesw

Antwort

0

Wenn Sie Zugriff auf XSLT 2.0 haben, ist der einfachste Weg, dies zu tun, wahrscheinlich eine Identitätstransformation (vorausgesetzt, Sie sind nur diese Aufgabe in dieser Transformation). Sie benötigen zwei Vorlagen:

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="command[preceding-sibling::command[@name = current()/@name]]"/> 

Die erste Vorlage kopiert die Eingabe unverändert in die Ausgabe. Die zweite Vorlage unterdrückt alle <command> Elemente, bei denen bereits ein <command> Element mit dem gleichen Wert für sein @name Attribut vorhanden ist.

Wenn Sie nur den Zugriff auf XSLT 1.0 haben wir die zweite Vorlage mit so etwas wie ersetzen:

<xsl:template match="command"> 
    <xsl:if test="not(preceding-sibling::command[@name = current()/@name])"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy>  
    </xsl:if> 
</xsl:template> 

(es andere Wege gibt, aber das ist einfach)

+0

Dies ist keine gute Methode -siehe hier warum: http://www.jenitennison.com/xslt/grouping/muenchian.html –

+0

Yeah. Ich bin mir dessen bewusst, aber wie gesagt, ich wollte einfach. Eine bessere Lösung wären Schlüssel, aber dann müssen Sie Schlüssel erklären. –

+2

Zumindest in XSLT 2.0 wäre eine bessere Lösung die Verwendung von 'xsl: for-each-group' oder' distinct-values ​​() '. Und die Münchische Gruppierung wurde schon oft erklärt (z. B. in dem oben verlinkten Artikel), man muss nur darauf hinweisen. –

Verwandte Themen