Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在XSLT2中加载实体?_Xml_Xslt 2.0_Saxon_Mathml_Xml Entities - Fatal编程技术网

Xml 在XSLT2中加载实体?

Xml 在XSLT2中加载实体?,xml,xslt-2.0,saxon,mathml,xml-entities,Xml,Xslt 2.0,Saxon,Mathml,Xml Entities,我正在使用XSLT2.0程序来处理一些MathML文档。在这些数学模型中,有一些实体,如&ApplyFunction和不可见时间,这会导致“实体未定义”错误。有没有一种方法可以在不加载MathML模式的情况下使用这些实体处理文档?(因为Saxon无法使用xsl:import schema…) 而且要清楚,我不需要使用XSLT中的实体;我需要处理包含它们的XML MathML有这样一个实体文件: <!ENTITY AElig "&#x000C6;" >&l

我正在使用XSLT2.0程序来处理一些MathML文档。在这些数学模型中,有一些实体,如
&ApplyFunction
不可见时间,这会导致“实体未定义”错误。有没有一种方法可以在不加载MathML模式的情况下使用这些实体处理文档?(因为Saxon无法使用
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 —>
...

过去,我通过在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解析器的责任,与XSLT处理器无关。为了使XML格式良好,必须声明实体,这意味着您需要有一个引用它们的(内部或外部)DTD:也就是说,源文档必须有一个合适的DOCTYPE声明


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

如果在读取输入XML时出现这些错误,则听起来XML不完整,需要声明实体。否则,XML解析器不知道用什么内容替换实体引用@这是一个有趣的解决方案。但恐怕我不能用它。首先,为了让它工作,包含的XML文档不能有
头,我无法控制它。我正在处理的MathML文档是动态生成的,并且将具有标题。此外,包装文件需要按名称引用包含的文件。如果包含的XML文档是动态生成的,我还需要动态生成包装文件,我认为XSLT做不到……您试图处理的MathML文件是否引用MathML DTD/实体文件?如果我理解正确,那么Saxon已经配置为从本地缓存加载MathML实体,只要XML输入文件正确引用它们。因此,对于任何试图使用实体引用而不是
&
&apos
,您的输入文件需要有一个DTD,该DTD直接声明实体或包含执行此操作的官方实体文件。这将允许您在样式表中使用这些实体引用。如果您想在源文档中使用它们,这将没有帮助。此外,如果您想在属性中使用它们,那么定义它们以扩展为xsl:text指令也没有用。
<?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
<!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>">
]>