2012-10-29 68 views
1

我是XSLT的新手,並花了數小時試圖找出似乎看起來很瑣碎的問題的解決方案。XSLT 2:將具有遞增值的元素添加到列表中

我有一個XML文檔,其中包含一個這樣的名單:

<Header> 
    <URLList> 
     <URLItem type="type1"> 
     <URL></URL> 
     </URLItem> 
     <URLItem type="type2"> 
     <URL>2</URL> 
     </URLItem> 
    </URLList> 
    </Header> 

如果它不存在,我現在需要的「ID」元素添加到每個URLItem。 ID元素的值必須是遞增的值。

的XML應該是這樣的結尾:

<Header> 
    <URLList> 
     <URLItem type="type1"> 
     <ID>1</ID> 
     <URL></URL> 
     </URLItem> 
     <URLItem type="type2"> 
     <ID>2</ID> 
     <URL>2</URL> 
     </URLItem> 
    </URLList> 
    </Header> 

我一直在嘗試不同的東西,但不能讓它正常工作。例如,如果我嘗試使用模板來匹配列表,我無法獲得正確的遞增值。將ID值[2,4],而不是[1,2],因爲它應該...這是XSLT:

<xsl:template match="/Header/URLList/URLItem[not(child::ID)]"> 
    <xsl:copy> 
     <ID> <xsl:value-of select="position()"/></ID> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

我一直也在嘗試使用for-每個這樣的循環:

<xsl:template match="/Header/URLList"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    <xsl:for-each select="/Header/URLList/URLItem"> 
     <xsl:if test="not(ID)"> 
      <xsl:element name="ID"><xsl:value-of select="position()" /></xsl:element> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 

這樣我似乎得到增量權,但新的ID元素出現在父節點。我一直無法找到將它們附加爲URLItem元素的子元素的方法。

任何幫助極大的讚賞。

+0

原因你得到2,4,6而不是1,2,3是在xsl:應用模板元素(這你沒有向我們顯示)選擇空白文本節點以及元素。您可以通過僅選擇元素(select =「*」)或通過在開始使用xsl:strip-space之前剝離空白文本節點來避免這種情況。 –

回答

3

而不是

<xsl:template match="/Header/URLList/URLItem[not(child::ID)]"> 
    <xsl:copy> 
     <ID> <xsl:value-of select="position()"/></ID> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

使用

<xsl:template match="/Header/URLList/URLItem[not(child::ID)]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <ID><xsl:number/></ID> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 
0
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml"/> 
<xsl:template match="/"> 
<Header> 
<xsl:apply-templates select="//URLList"/> 
</Header> 
</xsl:template> 
<xsl:template match="URLList"> 
<URLList> 
<xsl:for-each select="URLItem[not(child::ID)]"> 
<xsl:copy> 
    <xsl:apply-templates select="@*"/> 
     <ID> <xsl:value-of select="position()"/></ID> 
     <xsl:copy-of select="URL"/> 
    </xsl:copy> 
    </xsl:for-each> 
    </URLList> 
    </xsl:template> 
    <xsl:template match="@*"> 
<xsl:copy-of select="."/> 
    </xsl:template> 
</xsl:stylesheet>