如何在XSLT转换XML时保留注释内元素并完成指定节点转换?
XSLT转换实现:保留注释并重命名元素
当然可以在XSLT转换中保留注释内的元素,核心是显式处理注释节点,同时完成目标元素的重命名。以下是针对你需求的具体实现方案:
完整XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 去除多余空白,让输出更整洁 --> <xsl:strip-space elements="*"/> <!-- 保留目标元素内的文本空格 --> <xsl:preserve-space elements="newNote"/> <!-- 身份转换模板:默认复制所有未被专门匹配的节点/属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配注释节点,原样输出 --> <xsl:template match="comment()"> <xsl:copy-of select="."/> </xsl:template> <!-- 将div元素重命名为newDiv --> <xsl:template match="div"> <newDiv> <xsl:apply-templates select="@*|node()"/> </newDiv> </xsl:template> <!-- 将note元素重命名为newNote,并修改文本内容 --> <xsl:template match="note"> <newNote> <!-- 替换Hello为Hallo,若需动态处理可调整逻辑 --> <xsl:value-of select="translate(., 'Hello', 'Hallo')"/> </newNote> </xsl:template> </xsl:stylesheet>
代码说明
- 身份转换模板:作为基础规则,确保所有未被自定义模板匹配的节点(比如注释外的其他潜在元素、属性)都被原样复制,保证转换的完整性。
- 注释节点处理:专门匹配
comment()节点,直接复制输出,这样注释内的<rs>元素会被完整保留。 - 元素重命名:分别为
div和note编写模板,替换为目标标签newDiv和newNote,同时通过xsl:apply-templates处理它们的子节点(包括注释和文本)。 - 文本替换:通过
translate()函数将Hello替换为Hallo,如果你的需求是固定修改该文本,这个逻辑完全适用;如果是其他文本处理需求,可调整此部分代码。
测试验证
将你提供的输入XML应用上述XSLT转换后,会得到如下输出:
<newDiv> <!-- <rs type=”bible”>Mos 1</rs> --><newNote>Hallo World</newNote> </newDiv>
完全符合你的目标结构要求。
内容的提问来源于stack exchange,提问作者KSR
相关产品推荐
相关产品推荐

