在XSL中自重复增加自动编号

时间:2014-09-12 17:51:24

标签: xml xslt

声明

我最近问了一个question about complex autonumbers in XSL,并得到了一个非常好的答案。直到后来我意识到我忘记了我的例子中的一个细节。我不确定Stackoverflow推荐的政策是什么:我应该提出新问题还是开始修改我之前的帖子?由于我已经得到了一个很好的答案,我已经问过并接受了这一点,我认为最好提出一个新问题,因为它与我之前提出的问题有点不同。

问题

所以这是XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="test.xsl" type="text/xsl"?>
<XML>
<thing>line</thing>
<thing>line</thing>
<thing>line</thing>
<thing>line</thing>
</XML>

我需要将其转换为新的XML,它在开头具有以下结构:

<ids>
<id id="1" nr="0"/>
<id id="2" nr="10"/>
<id id="3" nr="10"/>
<id id="4" nr="20"/>
<id id="5" nr="20"/>
<id id="6" nr="30"/>
<id id="7" nr="30"/>
<id id="8" nr="40"/>
</ids>

我收到的以下样式表作为对我之前问题的回复几乎是这样做的。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output method="xml" omit-xml-declaration="no" />
<xsl:template match="/">
<XML>
    <ids>
        <xsl:for-each select="1 to xs:integer(count(//thing) * 2)">
            <id id="{position()}" nr="{(position() - 1)*10}"/>
        </xsl:for-each>
    </ids>
</XML>
</xsl:template>
</xsl:stylesheet>

它产生了这个:

<?xml version="1.0" encoding="UTF-8"?>
<XML>
<ids>
    <id id="1" nr="0"/>
    <id id="2" nr="10"/>
    <id id="3" nr="20"/>
    <id id="4" nr="30"/>
    <id id="5" nr="40"/>
    <id id="6" nr="50"/>
    <id id="7" nr="60"/>
    <id id="8" nr="70"/>
</ids>
</XML>

然而,我想在nr的模式中有0,10,10,20,20,30,30,40等,所需的数量是所需数量的两倍。原始XML中的事物节点。过去几天我一直想弄明白,但最后不得不再问一遍。在所有其他方面,这个XSL现在也非常适合我的真实数据。

2 个答案:

答案 0 :(得分:2)

这将做你想要的:

    <xsl:for-each select="1 to xs:integer(count(//thing))">
      <id id="{(position()-1)*2+1}" nr="{(position() - 1)*10}"/>
      <id id="{(position()-1)*2+2}" nr="{(position()    )*10}"/>
    </xsl:for-each>

可生产

<?xml version="1.0" encoding="UTF-8"?>
<XML>
   <ids>
      <id id="1" nr="0"/>
      <id id="2" nr="10"/>
      <id id="3" nr="10"/>
      <id id="4" nr="20"/>
      <id id="5" nr="20"/>
      <id id="6" nr="30"/>
      <id id="7" nr="30"/>
      <id id="8" nr="40"/>
   </ids>
</XML>

答案 1 :(得分:2)

这不是更简单吗?

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <XML>
        <ids>
            <xsl:for-each select="1 to 2 * count(XML/thing)">
                <id id="{.}" nr="{. idiv 2 * 10}"/>
            </xsl:for-each>
        </ids>
    </XML>
</xsl:template>

</xsl:stylesheet>