2009-07-23 16 views
2

Ich möchte eine Liste von Knotennamen gleicher Ebene ohne Duplikate anzeigen.Eliminiere doppelte Elemente derselben Ebene in XSLT

Sagen wir, ich

<a> 
    <b> 
     <c /> 
     <d /> 
     <d /> 
    </b> 
    <b> 
     <e /> 
     <c /> 
     <f /> 
    </b> 
</a> 

haben würde ich will c, d, e, f angezeigt werden. Ich habe mehrere Lösungen für ein ähnliches Problem gefunden, wobei doppelte Geschwister aus der Ausgabe entfernt werden, aber ich habe Probleme, doppelte "Cousins" zu eliminieren.

Antwort

0

Ich würde die XPath-Vorgänger-Geschwisterachse verwenden und nach dem gleichen lokalen Namen suchen. Ungeprüfte:

<xsl:template match="c|d|e|f"> 
    <xsl:if test="local-name(.) != local-name(preceding-sibling::*[1])"> 
     <xsl:copy-of select="."/> 
    </xsl:if> 
</xsl:template> 

IOW, wenn ein Element den gleichen Namen wie seine vorhergehenden Geschwister hat, ist es nicht kopiert bekommt.

+0

Ich denke du meinst 'preceding-sibling'. ;-) Auch das funktioniert nicht für alle Knoten auf der gleichen * Ebene *, nur für diejenigen innerhalb derselben Eltern, * und * nur, wenn sie bereits im Dokument sortiert sind. – Tomalak

+0

Danke; Ich habe den Namen der Achse korrigiert. Ich verstehe jetzt, dass dies das Problem des OP nicht löst. –

+0

Danke! Das hat mein Problem perfekt gelöst! –

1

Eine Möglichkeit:

<!-- make all element nodes accessible by their nesting level --> 
<xsl:key name="kNodesByLevel" match="*" use="count(ancestor-or-self::*)" /> 

<xsl:template match="/"> 
    <!-- select all nodes on one particular level --> 
    <xsl:variable name="lvl" select="key('kNodesByLevel', 3)" /> 

    <!-- step through them... --> 
    <xsl:for-each select="$lvl"> 
    <xsl:sort select="name()" /> 
    <xsl:variable name="name" select="name()" /> 
    <!-- ... and group them by node name --> 
    <xsl:if test="generate-id() = generate-id($lvl[name() = $name][1])"> 
     <xsl:copy-of select="." /> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

Ausgang für die XML Sie bereitgestellt:

<c /> 
<d /> 
<e /> 
<f /> 
Verwandte Themen