Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
Validation 在XSLT Ant任务中使用Saxon时,有没有禁用验证的方法?_Validation_Xslt_Ant - Fatal编程技术网

Validation 在XSLT Ant任务中使用Saxon时,有没有禁用验证的方法?

Validation 在XSLT Ant任务中使用Saxon时,有没有禁用验证的方法?,validation,xslt,ant,Validation,Xslt,Ant,我正在通过Ant的XSLT任务运行一些XSL转换。我使用Saxon 9HE作为处理引擎。我遇到的情况是,输入XML文件都使用相同的DTD,但声明它位于不同的位置。有些声明它在当前目录中,有些声明它在文件夹中,还有一些声明它引用URL。以下是Ant脚本: <?xml version="1.0" encoding="UTF-8"?> <project name="PubXML2EHeader" default="transform"> <property na

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

<?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: 原因: java.io.FileNotFoundException:

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

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

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

web上有很多关于如何使用Saxon设置目录解析器的信息,通常来自命令行:请参见此处的示例:

建议通常设置-x、-y和-r选项,但实际上,如果只需要重定向源文档中的DTD引用(-y影响样式表,-r影响document()函数),则只有-x才相关。在Ant中,设置-x选项的等效方法是使用factory元素的属性子级来设置配置属性

这仍然让我感到棘手的部分,实际上是创建目录文件