You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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="&#x2014;" string="&amp;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(., '&#x2014;', '&amp;mdash;')"/>
    </xsl:template>
</xsl:stylesheet>

该方法通过translate函数直接替换文本中的目标字符,兼容所有XSLT 1.0处理器。


内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:00:23