我有一個情況遍歷一個排序節點集和應用在每個節點的模板:傳遞給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>
它的工作原理,但有沒有更好的辦法?
好問題(+1)。您當前的解決方案並不錯,但帶有排序元素的xsl:variable屬於RTF類型,您需要在XSLT 1.0中使用xxx:node-set()擴展函數。看到我的解決方案如何做到這一點,而不需要任何擴展功能。 – 2010-04-07 22:18:09
是的,我結束了這樣做:使用exsl:node-set()。感謝您的解決方案! – 2010-04-07 22:42:50