【问题标题】:Renaming nodes and values with xslt使用 xslt 重命名节点和值
【发布时间】:2011-02-11 15:15:33
【问题描述】:

我是 xslt 的新手,并且有一个任务我不确定该去哪里。我想重命名节点,但保持所有节点声明的格式。在我将应用它的实际上下文中,我将进行一系列这样的重命名,但为了简洁起见,我编写的示例仅涉及重命名一个节点。我正在使用 XSL 1.0。

输入:

<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>

【问题讨论】:

    标签: xslt rename xslt-1.0


    【解决方案1】:
    <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>
    

    【讨论】:

    • 感谢您的魔法。对我理解 xslt 有很大帮助。
    【解决方案2】:

    这也可以,但我相信其他答案更好。只是想我会提供我的两分钱。

    <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>
    

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多