如何使用XSLT 1.0移除XML属性及文本中的所有连字符
问题原因
你编写的XSLT无法生效,核心是匹配根节点/的模板优先级高于通用节点复制模板,执行时会直接将整个文档的所有文本内容拼接后做替换,完全丢弃原XML的结构。
正确实现代码
以下XSLT 1.0代码可以完全保留原XML结构,仅移除所有属性值、文本内容中的连字符:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:strip-space elements="*"/> <!-- 复制所有元素、注释、处理指令,保留原有结构 --> <xsl:template match="*|processing-instruction()|comment()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 处理属性节点:移除属性值中的连字符 --> <xsl:template match="@*"> <xsl:attribute name="{name()}"> <xsl:value-of select="translate(., '-', '')"/> </xsl:attribute> </xsl:template> <!-- 处理文本节点:移除文本内容中的连字符 --> <xsl:template match="text()"> <xsl:value-of select="translate(., '-', '')"/> </xsl:template> </xsl:stylesheet>
代码说明
- 删除了原有代码中匹配根节点
/的模板,避免破坏结构复制逻辑 - 将原通用匹配模板拆分,单独对属性、文本节点做替换处理:用
translate()函数将节点值中的所有-替换为空字符串,其余节点完整复制 - 修正了原有
translate()函数的参数问题:你原代码中写的translate(.,'- ','')会同时移除连字符和空格,和你给出的预期输出不符,上述代码仅移除连字符,输出结果和你给出的示例完全一致。
内容的提问来源于stack exchange,提问作者runy29
相关产品推荐
相关产品推荐

