Saxon XQuery 目录文件覆盖 DTD URI?

Saxon XQuery catalog files to override DTD URI?

我正在尝试使用目录文件覆盖 XML 文件中的 DTD 位置。我尝试按照此处 How to use saxon built-in catalog feature 中的所有提示进行操作,但一直无法正常工作。我简化为这个简单的例子:

已确认的 Saxon 版本:

C:\test>java net.sf.saxon.Query
No query file name
Saxon-HE 9.7.0.7J from Saxonica
...

我的目录文件。我试图减少到最简单的 (uriSuffix):

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
    <uriSuffix uriSuffix="bad.dtd"  uri="good.dtd" />
</catalog>

已确认解析器位于类路径中,并且与目录的行为符合预期:

C:\test>java org.apache.xml.resolver.apps.resolver -c didcat.xml -u bad.dtd uri
Cannot find CatalogManager.properties
Resolve URI (uri):
        uri: bad.dtd
Result: file:/C:/test/good.dtd

简单test.xml文件:

<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "bad.dtd">
<a>hello world</a>

简单test.xql:

doc("test.xml")/a

结果:

C:\test>java net.sf.saxon.Query -t -catalog:didcat.xml test.xql
Loading catalog: didcat.xml
Saxon-HE 9.7.0.7J from Saxonica
Java version 1.8.0_101
Analyzing query from test.xql
Analysis time: 131.650519 milliseconds
Resolved URI: test.xml
        file:/C:/test/test.xml
Building tree for file:/C:/test/test.xml using class net.sf.saxon.tree.tiny.TinyBuilder
Error on line 2 column 6 of test.xql:
  FODC0002: I/O error reported by XML parser processing file:/C:/test/test.xml:
  C:\test\bad.dtd (The system cannot find the file specified)
Query failed with dynamic error: I/O error reported by XML parser processing file:/C:/test/test.xml: C:\test\bad.dtd (The system cannot find the file specified)

我尝试了几种不同的目录技术来覆盖 DTD URI,但 none 成功了。我究竟做错了什么?提前致谢。

要解析对 XML 实体(例如 DTD)的引用,您需要使用目录中的 systemSuffix 条目,而不是 uriSuffix 条目。将您的目录更改为

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
    <systemSuffix systemSuffix="bad.dtd" uri="good.dtd" />
</catalog>