2013-09-26 94 views
-1

感謝您的回覆。使用XSLT在標籤內部創建帶有計數器的XML標籤

對不起,不清楚這個問題。

我創建瞭如下的XSLT。

`

<xsl:output indent="yes"/> 

<xsl:template match="/"> 
     <DataElementsList> 
     <xsl:for-each select="//BC4JDataElementTransferObject"> 
     <xsl:variable name="index" select="count(preceding-sibling::BC4JDataElementTransferObject)+1" /> 
     <DataElement> 
      <PUBLICID> 
       <xsl:value-of select="//BC4JDataElementTransferObject[$index]/@public-id"/> 
      </PUBLICID> 
      <LONGNAME> 
       <xsl:value-of select="//BC4JDataElementTransferObject[$index]/long-name"/> 
      </LONGNAME> 
     </DataElement> 
     </xsl:for-each>                 
    </DataElementsList> 
</xsl:template> 

`

到目前爲止,我已經爲下面的XML文件輸出。

<?xml version="1.0" encoding="UTF-8"?>  
<DataElementsList> 
    <DataElement> 
     <PUBLICID>2183222</PUBLICID> 
     <LONGNAME>Alpha DVG Blood Pressure, Diastolic</LONGNAME> 
    </DataElement> 
    <DataElement> 
    <PUBLICID>7777777</PUBLICID> 
    <LONGNAME>Alpha DVG Blood Pressure, Diastolic</LONGNAME> 
    </DataElement> 
</DataElementsList> 

我想使可重複標籤有計數器。請參閱下面的示例。

<?xml version="1.0" encoding="UTF-8"?>  
<DataElementsList> 
    <DataElement num="1"> 
     <PUBLICID>2183222</PUBLICID> 
     <LONGNAME>Alpha DVG Blood Pressure, Diastolic</LONGNAME> 
    </DataElement> 
    <DataElement num="2"> 
    <PUBLICID>7777777</PUBLICID> 
    <LONGNAME>Alpha DVG Blood Pressure, Diastolic</LONGNAME> 
    </DataElement> 
</DataElementsList> 

從我的XSLT,我怎樣才能創造一個「數據元素」的標籤,當我運行轉換我的輸出XML將標籤內的櫃檯?

+0

... ... ... ... user2654219

+1

你到底想知道? – Neograph734

回答

1

如果我正確地理解了這個問題,您只是想爲每個包含「index」變量值的「DataElement」節點添加一個「num」屬性。

如果更換您的XSLT這個元素:

<DataElement> 

與此元素:

<DataElement num="{$index}"> 

那麼你應該得到的輸出如您在本例中提供。

+0

它的工作很漂亮。非常感謝。 – user2654219

+0

高興它爲你工作。如果時間允許,請關閉此問題,以便有類似問題的其他人可以將這些解決方案視爲成功,謝謝。 –

1

不知道你的XML看起來像什麼我將對這部分做出一些假設。但是,基本想法仍然有效。那就是你需要做的就是使用position()來創建你的索引。

我意識到這一點與你現在有點不同,但應該更有效率,併產生更好的結果。

所以,如果你把這個XML

<root> 
    <BC4JDataElementTransferObject/> 
    <BC4JDataElementTransferObject/> 
    <BC4JDataElementTransferObject/> 
    <BC4JDataElementTransferObject/> 
    <BC4JDataElementTransferObject/> 
</root> 

這XSL適用於它

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

    <xsl:template match="/"> 
    <DataElementsList> 
     <xsl:apply-templates select="//BC4JDataElementTransferObject"/> 
    </DataElementsList> 
    </xsl:template> 

    <xsl:template match="BC4JDataElementTransferObject"> 
    <xsl:variable name="index" select="position()" /> 
    <DataElement num="{$index}"> 
     Content here 
    </DataElement> 
    </xsl:template> 

</xsl:stylesheet> 

你得到這個輸出

<DataElementsList> 
    <DataElement num="1"> 
     Content here 
    </DataElement> 
    <DataElement num="2"> 
     Content here 
    </DataElement> 
    <DataElement num="3"> 
     Content here 
    </DataElement> 
    <DataElement num="4"> 
     Content here 
    </DataElement> 
    <DataElement num="5"> 
     Content here 
    </DataElement> 
</DataElementsList> 
+0

沒錯,這就是它。非常感謝。對不起,我不清楚的問題。我很難添加我的代碼。 – user2654219

+0

@ user2654219 - 你可以做'num =「{position()}」'而不是'num =「{$ index}」'。這將允許您完全刪除'xsl:variable'。 –

1

另一種替代position()是更加靈活/的能力是xsl:numberhttp://www.w3.org/TR/xslt#number)。

例子:

<DataElement> 
    <xsl:attribute name="num"> 
     <xsl:number/> 
    </xsl:attribute> 
    <!--additional content...--> 
</DataElement>