2014-09-12 52 views
1

免責聲明自我重複增加自動編號的XSL

最近,我問了一個question about complex autonumbers in XSL和quickely得到了一個很好的答案。直到後來才意識到我忘記了我的例子中的一個細節。我不確定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

這會做你想要什麼:

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

這幾乎工作,但會有0只有一次,在這之後計數將繼續對是很重要的。但我可以很容易想象使用這個模板,謝謝你分享它! – nikopartanen 2014-09-12 18:07:23

+0

查看編輯的簡單修復 – 2014-09-12 18:11:05

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>