全局重命名XML文档中的每个节点

时间:2011-12-07 21:29:15

标签: xml xslt rename

我希望通过附加带有后缀的现有名称来全局重命名XML元素中的每个节点。

我在下面写的当前XSLT有效,但丢失了元素值。我如何保留这些值?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="suffix" select="'_Ver1'"/>
<xsl:template match="node()">
    <xsl:element name="{concat(local-name(.), $suffix)}">
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>
</xsl:stylesheet>

3 个答案:

答案 0 :(得分:1)

节点测试node()匹配任何类型的节点(包括但不限于元素节点)。以下样式表实现了所有非元素节点的标准标识转换,其中用于重命名元素的附加模板

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="suffix" select="'_Ver1'"/>
    <xsl:template match="@*|node()[not(self::*)]">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:element name="{concat(local-name(.), $suffix)}">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

测试输入:

<root>
    <test1 attr="t">test</test1>
    <test1>testing</test1>
    <test1>tested</test1>
    <test1>tester</test1>
</root>

输出:

<root_Ver1>
    <test1_Ver1 attr="t">test</test1_Ver1>
    <test1_Ver1>testing</test1_Ver1>
    <test1_Ver1>tested</test1_Ver1>
    <test1_Ver1>tester</test1_Ver1>
</root_Ver1>

答案 1 :(得分:0)

尝试将|text()添加到表达式?

答案 2 :(得分:0)

这是因为node()还包括文本节点。如果您的输入XML有任何换行符,您可能已经注意到输出中的<_Ver1/>等元素。

尝试这样的事情:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:variable name="suffix" select="'_Ver1'"/>

  <xsl:template match="text()">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="*">
    <xsl:element name="{concat(name(.),$suffix)}">
      <xsl:copy-of select="@*"/>
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

我为text()添加了一个模板,并为XML中可能包含的任何属性添加了copy-of