2012-04-13 17 views
0

habe ich eine Reihe von Elementen mit verschiedenen Attributen, wie folgt aus:xsl: sort inhomogenen Elemente in xsl: for-each

<?xml version="1.0" encoding=utf-8"?> 
<root> 
    <elem at="4" iterate="third" /> 
    <foo/> 
    <elem at="1" iterate="first" /> 
    <bar/> 
    <elem start="3" end="9" iterate="second" /> 
</root> 

ich über die elem Tags laufen wollen, so spezifiziert ich die for-each wie diese

<xsl:for-each select="/root/elem"> 

so weit so gut, aber jetzt will ich sortieren diese Elemente nach ihrer @at und @start Feld, während jeder elem gewährleistet: haben entweder@atoder@start. Ich notierte im Attribut @iterate, wie ich die Tags iterieren möchte (nur aus Gründen der Klarheit hier).

Mein Ansatz war

<xsl:sort select="@at or @start" data-type="number" order="ascending" /> 

Aber das scheint nicht so, wie Elemente mit einem @at Attribute sollte zu funktionieren scheint über Elemente mit einem @start Attribute priorisiert werden.

Also, wie kann ich XSLT (1.0) sagen, nicht zwischen dem Namen des Attributs zu unterscheiden, das gesetzt ist und einfach nach seinem jeweiligen Wert sortieren?

Antwort

2

Sie sind nicht weit entfernt. Versuchen Sie es mit dem Union-Operator |

<xsl:sort select="@at|@start" data-type="number" order="ascending" /> 

Hier ist die vollständige XSLT

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

    <xsl:template match="root"> 
     <root> 
     <xsl:apply-templates select="elem"> 
      <xsl:sort select="@at|@start" data-type="number" order="ascending" /> 
     </xsl:apply-templates> 
     </root> 
    </xsl:template> 

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

Wenn auf Ihre XML angewendet, ist die folgende Ausgabe

<root> 
    <elem at="1" iterate="first"></elem> 
    <elem start="3" end="9" iterate="second"></elem> 
    <elem at="4" iterate="third"></elem> 
</root> 
+0

Sie haben Recht. Ich * war * ziemlich nah :) Danke! – bitmask