4

我在应用模板中使用 xsl:sort 对元素进行排序,我希望它们也被编号,但如果我尝试使用 xsl:number,那么它只会给出原始位置,而不是排序后的位置。我猜变量也不能使用,因为它们不能改变?那么如何正确编号我的列表呢?

4

2 回答 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>&#xA;</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 回答