解析 xsl 错误 - javax.xml.transform.TransformerException:xsl:output 元素上不允许使用 字符映射

Parsing xsl error- javax.xml.transform.TransformerException: use-character-maps attribute is not allowed on the xsl:output element

提问人:Rahul 提问时间:5/15/2023 最后编辑:Sujith KumarRahul 更新时间:5/16/2023 访问量:167

问:

在 Java 中使用 XML 序列化程序解析其中一个 XML 文件时,HTML 实体被转换为其相应的十六进制代码值(例如 mdash 输出是“hexcode value-#x2014;”),因此反映到最终的输出文件中。为了将十六进制代码值转换为普通实体,我们尝试了 xsl 转换,该转换会抛出错误“javax.xml.transformerException:xsl:output 元素不允许使用 use-character-maps 属性”。

以下是使用的 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" />
<xsl:character-map name="mdash">
<xsl:output-character character="&#x2014;" string="&amp;mdash;" />
</xsl:character-map>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@*" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

我们使用转换器工厂对象来转换最终的 XML,以通过 xsl 文件将十六进制代码转换为普通实体。

XSLT XML 解析 XSLT-2.0 SAXPasser DomParser

评论

0赞 Martin Honnen 5/15/2023
字符映射是在 XSLT 2.0 中引入的。大多数 Java JRE/JDK 中的默认 Transformer 基于 Xalan,它仅支持 XSLT 1.0。然而,在 Java 中,很容易将 Saxon 9 或 10 或(现在)11 github.com/Saxonica/Saxon-HE/tree/main/11/Java 或 12 github.com/Saxonica/Saxon-HE/tree/main/12/Java 版本放在类路径上以支持 XSLT 2 或 3
1赞 Rahul 5/16/2023
将 Saxon jar 导入 ClassPath 解决了此错误。

答:

0赞 Michael Kay 5/15/2023 #1

错误消息向我表明您正在尝试使用 XSLT 1.0 处理器运行 XSLT 2.0 样式表。

从技术上讲,如果样式表显示 version=“2.0”,则 XSLT 1.0 处理器应该在“向前兼容模式”下运行,该模式应该忽略它不理解的任何元素和属性(如),而不是引发错误。但我不确定这是否总是正确实现。use-character-maps

0赞 Rahul 5/16/2023 #2

正如马丁的评论中提到的。 将 saxon jar 导入 classpath 并使用 TransformerFactory 对象(如下所示)修复了此错误:-

TransformerFactory tfactory = new net.sf.saxon.TransformerFactoryImpl();