Validation 在XSLT Ant任务中使用Saxon时,有没有禁用验证的方法?
我正在通过Ant的XSLT任务运行一些XSL转换。我使用Saxon 9HE作为处理引擎。我遇到的情况是,输入XML文件都使用相同的DTD,但声明它位于不同的位置。有些声明它在当前目录中,有些声明它在文件夹中,还有一些声明它引用URL。以下是Ant脚本: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
<?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元素的属性子级来设置配置属性
这仍然让我感到棘手的部分,实际上是创建目录文件