声明
我最近问了一个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现在也非常适合我的真实数据。
答案 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>