2

我正在使用 XSLT 2.0 程序来处理一些 MathML 文档。在那些 MathMLs 中,有像⁡and之类的实体⁢,这给了我“实体未定义”的错误。有没有一种方法可以在不加载 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 —&gt;
...

也许我可以以某种方式利用它?

更新:多人提到输入文档应该有正确的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
4

2 回答 2

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>元素之前。我怀疑类似的方法会对您的情况有所帮助。

于 2017-07-11T22:01:10.403 回答
1

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

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

于 2017-07-13T10:52:00.047 回答