XSL转换报错:use-character-maps属性不可用于xsl:output元素
解决XML中十六进制字符编码转HTML实体的问题
问题分析
你遇到的错误javax.xml.transform.TransformerException: use-character-maps attribute is not allowed on the xsl:output element,核心原因是Java默认的XSLT处理器(如Xalan)仅支持XSLT 1.0,而你编写的<xsl:character-map>和use-character-maps是XSLT 2.0才引入的特性,因此触发语法错误。同时你当前的XSL模板存在缺陷:未在<xsl:output>中关联定义好的字符映射,且模板仅处理属性节点,未覆盖文本节点内容。
解决方案
方案1:使用支持XSLT 2.0的处理器(推荐)
改用Saxon这类支持XSLT 2.0/3.0的处理器,同时修正XSL代码:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <!-- 将字符映射关联到输出配置 --> <xsl:output omit-xml-declaration="yes" use-character-maps="mdash"/> <xsl:character-map name="mdash"> <!-- 匹配十六进制编码的破折号,输出对应的HTML实体 --> <xsl:output-character character="—" string="&mdash;"/> </xsl:character-map> <!-- 完整的身份转换模板,处理所有节点和属性 --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Java代码中需引入Saxon依赖(以Maven为例):
<dependency> <groupId>net.sf.saxon</groupId> <artifactId>Saxon-HE</artifactId> <version>12.4</version> </dependency>
创建TransformerFactory时指定Saxon的实现类:
TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl(); // 后续加载XSL、执行XML转换的逻辑保持不变
方案2:用XSLT 1.0实现字符替换(无需更换处理器)
如果不想更换XSLT处理器,可通过模板匹配文本节点,直接替换目标字符:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output omit-xml-declaration="yes" encoding="UTF-8"/> <!-- 基础身份转换模板,保留原XML结构 --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- 匹配所有文本节点,替换十六进制破折号为HTML实体 --> <xsl:template match="text()"> <xsl:value-of select="translate(., '—', '&mdash;')"/> </xsl:template> </xsl:stylesheet>
该方法通过translate函数直接替换文本中的目标字符,兼容所有XSLT 1.0处理器。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

