3

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: http://www.atypon.com/DTD/nlm-dtd/archivearticle.dtd原因: java.io.FileNotFoundException: http://www.atypon.com/DTD/nlm-dtd/archivearticle.dtd

これらは、Saxon が DTD にアクセスできないことが原因であると思います (この場合、実際にはファイアウォールの問題です)。ここで起こっていると思う入力の検証は気にしないので、スキップしたいと思います。XSLT Ant タスクに追加して、Saxon が DTD を読み込もうとするのを止めることができる属性はありますか?

4

1 に答える 1

6

「DTD の読み取り」と検証を混同しています。XSLT プロセッサは、検証中かどうかにかかわらず、常にパーサーにドキュメントの外部 DTD を読み取るように要求します。これは、DTD が検証以上の目的で使用されるためです。また、エンティティ参照の展開にも使用されます。

この問題に対処する通常の方法は、DTD 参照を、通常はカタログを使用してアクセスできる場所にあるコピーにリダイレクトすることです。これには、基礎となる XML パーサーでの EntityResolver の設定が含まれます。

通常はコマンド ラインから、Saxon でカタログ リゾルバを設定する方法について、ウェブ上に多くの情報があります。たとえば、次の URL を参照してください。

一般的には、-x、-y、および -r オプションを設定することをお勧めしますが、実際には、ソース ドキュメント内の DTD 参照をリダイレクトするだけでよい場合は、-x のみが関連します (-y はスタイルシートに影響し、-r はドキュメントに影響します())。関数)。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 に答える