我使用XSLT 2.0程序处理一些MathML文档。在那些MathML中,有⁡
和⁢
这样的实体,它们给我"实体未定义"错误。有没有一种方法可以在不加载MathML模式的情况下使用这些实体处理文档? (因为Saxon-HE无法使用xsl:import-schema
...)
为了清楚起见,我不需要在我的XSLT中使用这些实体;我需要处理拥有它们的XML。
这是MathML的实体文件,如下所示:
<!ENTITY AElig "Æ" ><!--LATIN CAPITAL LETTER AE -->
<!ENTITY AMP "&#38;" ><!--AMPERSAND -->
<!ENTITY Aacute "Á" ><!--LATIN CAPITAL LETTER A WITH ACUTE —>
...
也许我可以以某种方式利用它?
更新:多人提到输入文档应该有正确的DTD。所以这是一个最小的例子:
XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:m="http://www.w3.org/1998/Math/MathML">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:text>aaa</xsl:text>
</xsl:template>
</xsl:stylesheet>
带有DTD声明的MathML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN"
"http://www.w3.org/Math/DTD/mathml2/mathml2.dtd">
<math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mi> sin </mi>
<mo> ⁡ </mo>
<mi> x </mi>
</mrow>
</math>
现在撒克逊给了我这个错误:
I/O error reported by XML parser processing file:/path/to/mathml.xml: unknown protocol: classpath
答案 0 :(得分:1)
我过去通过声明XSL文件中的实体而获得了成功。例如:
<!DOCTYPE stylesheet [
<!ENTITY lsquo "<xsl:text disable-output-escaping='yes'>&#x2018;</xsl:text>">
<!ENTITY rsquo "<xsl:text disable-output-escaping='yes'>&#x2019;</xsl:text>">
<!ENTITY ldquo "<xsl:text disable-output-escaping='yes'>&#x201C;</xsl:text>">
<!ENTITY rdquo "<xsl:text disable-output-escaping='yes'>&#x201D;</xsl:text>">
]>
...在<?xml?>
声明之后和<xsl:stylesheet>
元素之前添加到文件顶部。我怀疑类似的方法会对你的情况有所帮助。
答案 1 :(得分:1)
为了强化其他答案/评论,实体扩展是XML解析器的责任,与XSLT处理器无关。要使XML格式正确,必须声明实体,这意味着您需要具有引用它们的(内部或外部)DTD:即源文档必须具有合适的DOCTYPE声明。
Saxon将做出的唯一贡献是它使自己的EntityResolver可用于XML解析器。术语“EntityResolver”有点用词不当,因为它实际上并没有扩展像⁢
这样的实体引用;所有这一切都是找到外部DTD文件,以满足DOCTYPE声明中出现的系统ID和公共ID。