我在应用模板中使用 xsl:sort 对元素进行排序,我希望它们也被编号,但如果我尝试使用 xsl:number,那么它只会给出原始位置,而不是排序后的位置。我猜变量也不能使用,因为它们不能改变?那么如何正确编号我的列表呢?
问问题
6144 次
2 回答
1
您可以使用<xsl:value-of select="position()" />
来获取循环中的当前位置。
来自 xpath 规范:position 函数从表达式求值 context 返回一个等于上下文位置的数字。
XML:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<library>
<book><name>abc</name></book>
<book><name>def</name></book>
<book><name>aaa</name></book>
</library>
XSLT (test.xsl):
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="/library/book">
<xsl:sort select="name" data-type="text" />
<xsl:value-of select="position()" />: <xsl:value-of select="name" />,
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
于 2011-03-05T23:26:59.090 回答
1
来自 OP 的评论:
哦,那行得通!谢谢!我没有使用 for-each 循环,
<xsl:apply-templates select="book">
而是使用了。但是对于每个它都有效
这里有两个例子,都使用<xsl:apply-templates>
--not <xsl:for-each>
:
<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="/*">
<xsl:apply-templates>
<xsl:sort select=". mod 3"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="num">
<xsl:text>
</xsl:text>
<xsl:value-of select="position()"/>: <xsl:text/>
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下 XML 文档时:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
它产生一个编号的元素列表,按它们除以 3 时的余数排序:
1: <num>03</num>
2: <num>06</num>
3: <num>09</num>
4: <num>01</num>
5: <num>04</num>
6: <num>07</num>
7: <num>10</num>
8: <num>02</num>
9: <num>05</num>
10: <num>08</num>
第二个示例是 XSLT 1.0 中广泛使用的编程习惯用法:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<numsMax>
<xsl:apply-templates>
<xsl:sort data-type="number" order="descending"/>
</xsl:apply-templates>
</numsMax>
</xsl:template>
<xsl:template match="num">
<xsl:if test="position()=1">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下 XML 文档时:
<nums>
<num>07</num>
<num>10</num>
<num>05</num>
<num>02</num>
<num>03</num>
<num>08</num>
<num>04</num>
<num>01</num>
<num>06</num>
<num>09</num>
</nums>
position()=1
它使用排序的节点列表产生所有数字的最大值:
<numsMax>
<num>10</num>
</numsMax>
于 2011-03-06T16:12:29.743 回答