【发布时间】:2013-06-05 09:51:48
【问题描述】:
这是我的问题。
我有一个使用引用并包含其他 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>
然后我有一个 XSL,它使用 document() 函数打开 file2.XML,其中包括引用(在 myref.ref 中引用)。
因此,当我使用 document('file2.XML') 时,我收到一条错误消息,指出实体“reventity”已被引用但未声明。
当我使用 document() 打开其他 XML 时,如何使用 myref.ref ?
谢谢。
【问题讨论】:
-
您使用哪个 XSLT 处理器,以及(更重要的是)您使用哪个底层 XML 解析器?像 expat 这样的非验证解析器可能不会解析外部实体,即使使用验证解析器,出于安全原因,这些功能有时也会默认禁用。
-
我已经尝试使用 Xalan 和 Saxon XSLT 处理器,但我遇到了同样的错误。我在转换过程中没有使用任何底层 XML 解析器,问题应该出在 XSL 中。外部 XML 文件已正确读取。如果我没有任何引用,它可以正常工作。
-
能否与我们分享您的 XML 文件和 XSLT 文件。
-
您的 XSLT 处理器不解析 XML 本身,它使用 XML 解析器。如果您使用 Saxon(9.5?),您是否尝试过使用命令行选项 saxonica.com/documentation/html/using-xsl/commandline.html,例如
-dtd:(on|off|recover)?而且您的示例令人困惑,它有DOCTYPE doctype,这意味着XML 的根元素名称应该是doctype,但您有xi:include。您可以发布所有文件的最小但完整的示例来重现问题吗?我目前不确定您在哪些文件中有 DOCTYPE 以及在哪个错误中。 -
@NavinRawat xml 已经存在,XSLT 在 file2.XML 上使用 document() 函数,file2.XML 只是块内的引用。在参考文件中只有一个参考。这个错误正是我在帖子中写的。
标签: xml xslt reference xinclude