我有一个情况遍历一个排序节点集和应用在每个节点的模板:传递给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