如何在 XSLT 中对排序列表进行编号

发布于 2024-10-20 15:21:30 字数 136 浏览 8 评论 0原文

我在 apply-templates 中使用 xsl:sort 对元素进行排序,我希望它们也编号,但如果我尝试使用 xsl:number,那么它只会给出原始位置,而不是排序后的位置。我猜变量也不能使用,因为它们不能改变?那么我怎样才能正确地给我的清单编号呢?

I used xsl:sort in apply-templates to sort the elements and I would like to have them also numbered, but if I try to use xsl:number, then it just gives the original position, not the one after sorting. I guess variables can't be used either because they cannot be changed? So how can I correctly number my list?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

迟到的我 2024-10-27 15:21:30

您可以使用 获取循环中的当前位置。

根据 xpath 规范: position 函数返回一个等于表达式求值中上下文位置的数字上下文

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(测试.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>

You can use <xsl:value-of select="position()" /> to get the current position in the loop.

From the xpath spec: The position function returns a number equal to the context position from the expression evaluation 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>
把昨日还给我 2024-10-27 15:21:30

来自OP的评论:

噢,那成功了!谢谢你!我不是
使用 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>

From a comment of the OP:

Oh, that worked! Thank you! I was not
using the for-each loop, had
<xsl:apply-templates select="book">
instead. But with for-each it works

Here are two examples, both using <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>

When this transformation is applied on the following XML document:

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

It produces a numbered list of elements, sorted by their remainder when divided by 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>

The second example is a programming idiom used extensively in 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>

When this transformation is applied on the following XML document:

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

It produces the maximum of all the numbers, using position()=1 on the sorted node-list:

<numsMax>
   <num>10</num>
</numsMax>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文