在XSLT 2中加载实体?

时间:2017-07-11 20:57:44

标签: xml xslt-2.0 saxon mathml xml-entities

我使用XSLT 2.0程序处理一些MathML文档。在那些MathML中,有⁡⁢这样的实体,它们给我"实体未定义"错误。有没有一种方法可以在不加载MathML模式的情况下使用这些实体处理文档? (因为Saxon-HE无法使用xsl:import-schema ...)

为了清楚起见,我不需要在我的XSLT中使用这些实体;我需要处理拥有它们的XML。

这是MathML的实体文件,如下所示:

<!ENTITY AElig            "&#x000C6;" ><!--LATIN CAPITAL LETTER AE -->
<!ENTITY AMP              "&#38;#38;" ><!--AMPERSAND -->
<!ENTITY Aacute           "&#x000C1;" ><!--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> &ApplyFunction; </mo> 
    <mi> x </mi> 
  </mrow> 
</math>

现在撒克逊给了我这个错误:

I/O error reported by XML parser processing file:/path/to/mathml.xml: unknown protocol: classpath

2 个答案:

答案 0 :(得分:1)

我过去通过声明XSL文件中的实体而获得了成功。例如:

<!DOCTYPE stylesheet [
<!ENTITY lsquo "<xsl:text disable-output-escaping='yes'>&amp;#x2018;</xsl:text>">
<!ENTITY rsquo "<xsl:text disable-output-escaping='yes'>&amp;#x2019;</xsl:text>">
<!ENTITY ldquo "<xsl:text disable-output-escaping='yes'>&amp;#x201C;</xsl:text>">
<!ENTITY rdquo "<xsl:text disable-output-escaping='yes'>&amp;#x201D;</xsl:text>">
]>

...在<?xml?>声明之后和<xsl:stylesheet>元素之前添加到文件顶部。我怀疑类似的方法会对你的情况有所帮助。

答案 1 :(得分:1)

为了强化其他答案/评论,实体扩展是XML解析器的责任,与XSLT处理器无关。要使XML格式正确,必须声明实体,这意味着您需要具有引用它们的(内部或外部)DTD:即源文档必须具有合适的DOCTYPE声明。

Saxon将做出的唯一贡献是它使自己的EntityResolver可用于XML解析器。术语“EntityResolver”有点用词不当,因为它实际上并没有扩展像&InvisibleTimes;这样的实体引用;所有这一切都是找到外部DTD文件,以满足DOCTYPE声明中出现的系统ID和公共ID。