我希望通过附加带有后缀的现有名称来全局重命名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>
答案 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
。