1

有我的问题。

我有一个使用引用并包含其他 XML 文件的 XML 文件

XML 文件(由 XSL 解析):

<?xml version="1.0" encoding="utf-8"?>
<!ENTITY % references SYSTEM "myref.ref">
<test>
    <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="file2.XML"/>
</test>

文件2.XML:

<?xml version="1.0" encoding="utf-8"?>
<action>&testref;</action>

myref.ref :

<!ENTITY  testref 'cool ref there'>

XSL:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <xsl:apply-templates select="//test"/>
</xsl:template>

<xsl:template match="test">
    <xsl:for-each select="document('file2.XML')//action">
    [...]
</xsl:template>

然后我有一个使用 document() 函数打开包含引用(在 myref.ref 中引用)的 file2.XML 的 XSL。

因此,当我使用 document('file2.XML') 时,我收到一条错误消息,指出实体“reventity”已被引用,但未声明。

当我使用 document() 打开其他 XML 时,如何使用 myref.ref ?

谢谢。

4

1 回答 1

1

您描述为“XML 文件(由 XSL 解析)”的文件不是 XML;如果实体声明包含在文档类型声明中,它将是 XML,但现在不是。如果您的 XSLT 处理器没有抱怨,我假设您处理的不是您显示的内容,而是更像

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test [
<!ENTITY % references SYSTEM "myref.ref">
]>
<test>
  <xi:include 
    xmlns:xi="http://www.w3.org/2001/XInclude" 
    href="file2.XML"/>
</test>

XInclude 规范指定默认情况下包含的资源被解析为好像它们具有 MIME类型application/xml;它明确地使 DTD 处理的性能或非性能不受约束。如果 XInclude 处理器确实对其执行 DTD 处理,我希望它使用 XInclude 目标的 DTD,而不是包含 XML 文档的 DTD。也就是说,考虑到显示的输入,如果任何 XInclude 处理器确实做了您希望的事情,我会感到惊讶。我系统上的 libxml 副本只是引发了您提到的错误,抱怨未定义实体“testref”。

另一方面,我不得不承认,很难说你想要的显然与 XInclude 规范不兼容。毕竟,该规范明确表示“是否执行 DTD 或 XML 模式验证的细节……不受本规范的约束”。鉴于该声明,很难争辩说 XInclude 规范要求对包含资源的任何 DTD 处理都使用包含资源的 DTD 而不是包含资源的 DTD 执行。DTD 处理不受 XInclude 规范的约束;我没有办法证明希望将包含的资源像外部实体一样解析是错误的。当然,同样的道理,当 xmllint 抱怨未声明的实体时,它显然是在其作为合格处理器的权利范围内。

由于 XInclude 的设计显然是试图使外部实体变得不必要,因此决定解析包含的资源,就好像它们是外部实体一样,这将是一个非常不寻常的实现。(如果包含的资源有自己的 DTD,这样的处理器会做什么?发出错误?执行回退处理?)无论对错,我怀疑你会在这里找到任何 XInclude 处理器,做你想做的事;如果我是你,我会重新考虑我的设计。

于 2013-06-06T01:38:26.383 回答