2010-04-07 45 views
8

我有一個情況遍歷一個排序節點集和應用在每個節點的模板:傳遞給XSL之前排序節點集:對,每個

<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> 

我想要做一些特別的「第一個「節點集中的5個節點並呈現它們的嵌套元素。問題是他們需要按照相同的順序進行排序(因爲他們在循環中)。

我已經計劃通過使用兩個xsl:for-each元素來完成此操作,每個元素都具有從集合中選擇的正確節點。我不能做到這一點,但是,因爲它們需要進行排序之前我可以選擇「第一」 5.

例子:

<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> 

我不認爲這會工作,因爲我在排序前選擇位置,但我不能在xsl:for-each以外使用xsl:sort

我接近這個不正確嗎?

編輯:我目前的解決方案是對它們進行排序和存儲排序另一個變量設置:

<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> 

它的工作原理,但有沒有更好的辦法?

+0

好問題(+1)。您當前的解決方案並不錯,但帶有排序元素的xsl:variable屬於RTF類型,您需要在XSLT 1.0中使用xxx:node-set()擴展函數。看到我的解決方案如何做到這一點,而不需要任何擴展功能。 – 2010-04-07 22:18:09

+0

是的,我結束了這樣做:使用exsl:node-set()。感謝您的解決方案! – 2010-04-07 22:42:50

回答

14

這裏是爲此在XSLT 1.0,而無需使用xxx:node-set()擴展功能一個辦法:

<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> 

當上述轉變被這個簡單的XML文檔施加:

<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> 

想要的結果產生

<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

解決了我的問題,謝謝 – 2010-05-20 23:30:17