求助:使用XSLT 1.0重命名XML中<add-attr>节点为<attr>无输出问题排查
问题分析与解决方案
首先,你的XSLT代码无法产生输出的核心原因是缺少必要的XSLT根声明,另外还有一个多余的模板。让我们一步步拆解问题:
你的代码存在的问题
- 没有
<xsl:stylesheet>根元素及必要的命名空间和版本声明:XSLT处理器需要这个根元素来识别这是一个有效的XSLT文件,缺少它的话处理器根本无法解析你的代码。 - 多余的
<xsl:template match="@add-attr">模板:@add-attr匹配的是名为add-attr的属性,但你的XML里只有<add-attr>元素,没有这样的属性,这个模板永远不会被触发,完全没必要保留。 - 虽然
match="//add-attr"是有效的,但直接match="add-attr"更简洁,因为身份模板会递归处理所有节点,不需要绝对路径。
修正后的XSLT 1.0代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:复制所有未被其他模板匹配的节点和属性 --> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配所有add-attr元素,将其重命名为attr --> <xsl:template match="add-attr"> <attr> <xsl:apply-templates select="@*|node()"/> </attr> </xsl:template> </xsl:stylesheet>
代码说明
- 身份模板:这是XSLT中最基础的模板,负责复制所有没有被专门模板匹配的节点(包括元素、文本、属性等),保证XML结构的其余部分保持不变。
- 重命名模板:专门匹配
<add-attr>元素,当遇到它时,会创建一个新的<attr>元素,然后把原元素的所有属性和子节点都复制到这个新元素里,完美实现你的需求。
用这个代码处理你的输入XML,就能得到你期望的输出结果。
内容的提问来源于stack exchange,提问作者Petro Hagenauw
相关产品推荐
相关产品推荐

