2010-04-07 10 views
8

Ich habe eine Situation, in der Schleife durch eine sortierte nodeset und eine Vorlage auf jedem des Knoten gilt:eine nodeset, bevor er zu xsl Reihenfolge: for-each

<div id="contractscontainer"> 
    <xsl:for-each select="document"> 
    <xsl:sort select="content[@name='ClientName']/text()" /> 
    <xsl:apply-templates select="." mode="client-contract" /> 
    </xsl:for-each> 
</div> 

ich mit etwas Besonderes will das tun " Zuerst "5 Knoten im Knotensatz und render sie verschachteltes Element. Das Problem ist, dass sie in der gleichen Reihenfolge sein müssen, als ob sie sortiert wären (wie sie in der Schleife sind).

Ich hatte geplant, dies zu tun, indem Sie zwei xsl:for-each Elemente, jeweils mit den richtigen Knoten aus dem Satz ausgewählt. Ich kann das nicht tun, aber, weil sie sortiert werden müssen vor ich wählen kann die „erste“ 5.

Beispiel:

<div id="contractscontainer"> 
    <div class="first-five"> 
    <xsl:for-each select="document[position() < 6]"> 
     <xsl:sort select="content[@name='ClientName']/text()" /> 
     <xsl:apply-templates select="." mode="client-contract" /> 
    </xsl:for-each> 
    </div> 
    <div class="rest-of-them"> 
    <xsl:for-each select="document[position() > 5]"> 
     <xsl:sort select="content[@name='ClientName']/text()" /> 
     <xsl:apply-templates select="." mode="client-contract" /> 
    </xsl:for-each> 
    </div> 
</div> 

Ich glaube nicht, das, weil ich arbeiten wähle die Knoten nach Position vor sortiert sie, aber ich kann xsl:sort außerhalb der xsl:for-each nicht verwenden.

Bin ich das falsch?

bearbeiten: Meine aktuelle Lösung ist, sie zu sortieren und speichern die sortiert gesetzt in einer anderen Variablen:

<xsl:variable name="sorted-docs"> 
    <xsl:for-each select="document"> 
    <xsl:sort select="content[@name='ClientName']/text()" /> 
    <xsl:copy-of select="." /> 
    </xsl:for-each> 
</xsl:variable> 

Es funktioniert, aber es gibt einen besseren Weg?

+0

Gute Frage (+1). Ihre aktuelle Lösung ist nicht schlecht, aber die xsl: -Variable mit den sortierten Elementen ist vom Typ RTF und Sie müssen die xxx: node-set() - Erweiterungsfunktion in XSLT 1.0 verwenden. Sehen Sie meine Lösung, wie Sie dies tun, ohne dass Sie irgendwelche Erweiterungsfunktionen benötigen. –

+0

Ja, ich habe genau das gemacht: mit exsl: node-set(). Danke für deine Lösung! –

Antwort

14

Hier ist ein Weg, dies ohne die Notwendigkeit, in XSLT 1.0 zu tun, um die xxx:node-set() Erweiterungsfunktion zu verwenden:

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

<xsl:template match="/*"> 
    <html> 
    <div class="first-five"> 
    <xsl:apply-templates select="num"> 
     <xsl:sort select="." data-type="number"/> 
     <xsl:with-param name="pStart" select="1"/> 
     <xsl:with-param name="pEnd" select="5"/> 
    </xsl:apply-templates> 
    </div> 
    <div class="rest-of-them"> 
    <xsl:apply-templates select="num"> 
     <xsl:sort select="." data-type="number"/> 
     <xsl:with-param name="pStart" select="6"/> 
    </xsl:apply-templates> 
    </div> 
    </html> 
</xsl:template> 

<xsl:template match="num"> 
    <xsl:param name="pStart"/> 
    <xsl:param name="pEnd" select="999999999999"/> 

    <xsl:if test="position() >= $pStart 
       and 
       not(position() > $pEnd)"> 
    <p><xsl:value-of select="."/></p> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

Wenn die obige Transformation auf diesem einfachen XML-Dokument angelegt wird:

<nums> 
    <num>5</num> 
    <num>3</num> 
    <num>6</num> 
    <num>8</num> 
    <num>4</num> 
    <num>1</num> 
    <num>9</num> 
    <num>2</num> 
    <num>7</num> 
    <num>10</num> 
</nums> 

das gewünschte Ergebnis wird:

produziert
<html> 
    <div class="first-five"> 
     <p>1</p> 
     <p>2</p> 
     <p>3</p> 
     <p>4</p> 
     <p>5</p> 
    </div> 
    <div class="rest-of-them"> 
     <p>6</p> 
     <p>7</p> 
     <p>8</p> 
     <p>9</p> 
     <p>10</p> 
    </div> 
</html> 
+0

Mein Problem gelöst, danke –

Verwandte Themen