2010-04-20 79 views
10

我有一個這樣的XML:如何使用XSLT重命名屬性?

<person name="foo" gender = "male" /> 

我想將它轉化爲

<person id="foo" gender="male" /> 

有沒有辦法做到這一點使用XSLT?

  • 我將有很多的子節點的人

  • 我會在人多的屬性。

+0

這看起來更像是將屬性重命名給我,除非您的實際場景中沒有更多內容涉及到問題。 – 2010-04-20 23:45:12

回答

13

這是非常簡單的:使用恆等變換,並創建一個模板變換name屬性:

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@name"> 
    <xsl:attribute name="id"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 

這將在文檔中留下的一切,除了name屬性正是因爲它是。如果您只想更改person元素上的name屬性,請在模板的match屬性中添加更具限制性的XPath,例如, person/@name

+0

簡潔,乾淨,簡單。優秀的答案。 – markusk 2010-04-21 07:01:55

+0

工作很好。 – unj2 2010-04-21 18:33:30

-1

這應該這樣做,不太清楚的{名()},但你可以替換成「人」

> <xsl:template match="person"> 
>  <xsl:element name="{name()}"> 
>   <xsl:attribute name="id"> 
>   <xsl:value-of select="@name"/> 
>   </xsl:attribute> 
>   <xsl:attribute name="gender"> 
>   <xsl:value-of select="@gender"/> 
>   </xsl:attribute> 
>  </xsl:element> 
>  </xsl:template> 
+0

我是否需要爲每個屬性創建一個屬性?我可以複製除ID之外的所有屬性嗎? – unj2 2010-04-21 01:48:08

+0

使用'xsl:element',一個屬性值模板和'name()'函數來創建一個你已經知道的名字的元素是瘋狂的。將''替換爲'',你也可以用AVT代替'xsl:attribute'元素。儘管如此,答案仍然不對(對kunjaan的問題的答案是「不,除非你這樣做」),但這樣做不會錯。 – 2010-04-21 04:33:16

+0

只是試圖提供一種適用於任何元素而不管名稱的通用解決方案。如果它只能用於元素,那麼當然更簡單的硬編碼解決方案會更好。 – derek 2010-04-21 11:19:24