3

我正在通过 Ant 的 XSLT 任务运行一些 XSL 转换。我使用 Saxon 9HE 作为处理引擎。我有一种情况,输入 XML 文件都使用相同的 DTD,但声明它位于不同的位置。有些声明它在当前目录中,有些在文件夹中,有些则引用 URL。这是蚂蚁脚本:

<?xml version="1.0" encoding="UTF-8"?>

<project name="PubXML2EHeader" default="transform">
    <property name="data.dir.input" value="./InputXML"/>
    <property name="data.dir.output" value="./converted-xml"/>
    <property name="xslt.processor.location" value="D:\\saxon9he.jar"/>
    <property name="xslt.processor.factory" value="net.sf.saxon.TransformerFactoryImpl"/>

    <path id="saxon9.classpath" location="${xslt.processor.location}"/>

    <target name="clean">
        <delete dir="${data.dir.output}" includes="*.xml" failonerror="no"/>
    </target>

    <target name="transform" depends="clean">
        <xslt destdir="${data.dir.output}"
              extension=".xml"
              failOnTransformationError="false"
              processor="trax"
              style="Transform.xsl"
              useImplicitFileset="false"
              classpathref="saxon9.classpath"
        >
            <outputproperty name="method" value="xml"/>
            <outputproperty name="indent" value="yes"/>
            <fileset dir="${data.dir.input}" includes="**/*.xml" excludes="Transform.xml"/>
            <factory name="${xslt.processor.factory}"/>
        </xslt>
    </target>

</project>

当我运行这个 Ant 脚本时,我得到如下错误:

[xslt]:致命错误!XML 解析器处理文件报告的 I/O 错误:/D:/annurev.biophys.093008.131228.xml: http: //www.atypon.com/DTD/nlm-dtd/archivearticle.dtd原因:java.io.FileNotFoundException: http://www.atypon.com/DTD/nlm-dtd/archivearticle.dtd

我认为这是因为撒克逊人无法访问 DTD(在这种情况下实际上是防火墙问题)。我不认为我关心验证输入,这就是我认为这里发生的事情,我想跳过它。是否可以向 XSLT Ant 任务添加一个属性来阻止 Saxon 尝试读取 DTD?

4

1 回答 1

6

您将“阅读 DTD”与验证混淆了。XSLT 处理器总是要求解析器读取文档的外部 DTD,无论它是否正在验证。这是因为 DTD 不仅用于验证,还用于验证。它也用于实体引用的扩展。

处理此问题的常用方法是将 DTD 引用重定向到可以访问它的某个副本,通常使用目录。这涉及在底层 XML 解析器上设置 EntityResolver。

网上有很多关于如何使用 Saxon 设置目录解析器的信息,通常来自命令行:例如,请参见此处: http: //www.sagehill.net/docbookxsl/UseCatalog.html

建议通常是设置 -x、-y 和 -r 选项,但实际上,如果您只需要重定向源文档中的 DTD 引用,则只有 -x 相关(-y 影响样式表,-r 影响 document()功能)。在 Ant 中,设置 -x 选项的等价物是使用 factory 元素的属性 child 来设置配置属性<attribute name="http://saxon.sf.net/feature/sourceParserClass" value="org.apache.xml.resolver.tools.ResolvingXMLReader"/>

这仍然留下了我觉得棘手的部分,这实际上是创建您的目录文件。

于 2012-10-31T21:47:54.107 回答