2011-02-11 105 views
3

我是xslt的新手,並且有一項任務,我不確定該怎麼處理。我想重命名節點,但保持所有節點聲明的格式。在實際的情況下,我會應用這個,我會做一系列像這樣的重命名,但爲了簡潔起見,我寫的樣本只涉及重命名一個節點。我正在使用XSL 1.0。使用xslt重命名節點和值

輸入:

<variables> 
    <var> 
    <RENAME> a </RENAME> 
    </var> 
    <var RENAME='b'/> 
    <var> 
    <DO_NOT_TOUCH> c </DO_NOT_TOUCH> 
    </var> 
    <var DO_NOT_TOUCH='d'/> 
</variables> 

所需的輸出:

<variables> 
    <var> 
    <DONE> a </DONE> 
    </var> 
    <var DONE='b'/> 
    <var> 
    <DO_NOT_TOUCH> c </DO_NOT_TOUCH> 
    </var> 
    <var DO_NOT_TOUCH='d'/> 
</variables> 

我的XSLT:

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

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

電流輸出

<variables> 
    <var> 
    <RENAMED> a </RENAMED> 
    </var> 
    <var RENAME="b"> 
    </var> 
    <var> 
    <DO_NOT_TOUCH> c </DO_NOT_TOUCH> 
    </var> 
    <var DO_NOT_TOUCH="d"> 
    </var> 
</variables> 

回答

10
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="RENAME"> 
     <DONE> 
      <xsl:apply-templates select="@* | node()"/> 
     </DONE> 
    </xsl:template> 
    <xsl:template match="@RENAME"> 
     <xsl:attribute name="DONE"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

輸出對您的樣本:

<variables> 
    <var> 
     <DONE> a </DONE> 
    </var> 
    <var DONE="b"></var> 
    <var> 
     <DO_NOT_TOUCH> c </DO_NOT_TOUCH> 
    </var> 
    <var DO_NOT_TOUCH="d"></var> 
</variables> 
+0

+1爲正確的解決方案。 – 2011-02-11 15:35:38

0

這也工作,但我相信,對方的回答是好。只是以爲我會提供我的兩分錢。

<xsl:variable name="Foo" select="DONE"/> 

<variables> 
    <var> 
    <xsl:element name="{$Foo}"> a </xsl:element> 
    </var> 
    <var DONE='b'/> 
    <var> 
    <DO_NOT_TOUCH> c </DO_NOT_TOUCH> 
    </var> 
    <var DO_NOT_TOUCH='d'/> 
</variables>