2011-02-11 77 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>