2011-03-05 39 views
3

我在应用模板中对xsl:sort进行了排序来对元素进行排序,我想让它们也编号,但是如果我尝试使用xsl:number,那么它只是给出原始位置,而不是排序后的那个。我猜变量不能被使用,因为它们不能被改变?那么我怎样才能正确地为我的列表编号?如何在XSLT中对已排序的列表进行编号

+0

问得好,+1。使用''(不使用''),查看我的答案,以获得编排排序节点列表的两个完整,简短和简单的示例。 :) – 2011-03-06 16:14:11

回答

1

您可以使用<xsl:value-of select="position()" />来获取循环中的当前位置。

从xpath规范: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> 
+0

哦,那工作!谢谢!我没有使用for-each循环,而是使用。但是对于每一个它都有效。 – Joza 2011-03-06 09:49:28

+0

@ user646448:它应该与两者“工作”。 – 2011-03-06 15:59:18

+0

+1正确答案。 – 2011-03-06 16:00:19

1

从OP的评论:

哦,成功了!谢谢!我不是使用for-each循环的 ,而是使用 <xsl:apply-templates select="book"> 代替。但随着-每次工作

这里有两个例子,使用<xsl:apply-templates>都 - 不<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> 

它产生一个编号的列表列表NTS,当除以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> 
相关问题