XML ドキュメントのオフライン変換をプログラムする必要があります。元の XML ファイルを次のようにロードすると、DTD ネットワーク ルックアップを停止できました。
DocumentBuilderFactory factory;
factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);
factory.setFeature("http://xml.org/sax/features/namespaces", false);
factory.setFeature("http://xml.org/sax/features/validation", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
// open up the xml document
docbuilder = factory.newDocumentBuilder();
doc = docbuilder.parse(new FileInputStream(m_strFilePath));
ただし、これをTransformerFactoryオブジェクトに適用することはできません。DTD はローカルで利用できますが、ネットワーク ルックアップを試みるのではなく、トランスフォーマーにローカル ファイルを参照させる方法がわかりません。
私が見る限り、トランスフォーマーは変換を正しく行うためにこれらのドキュメントを必要とします。
参考までに、MusicXML ドキュメントを Partwise から Timewise に変換しています。
おそらくご想像のとおり、XSLT は私の得意分野ではありません (それとはかけ離れています)。
ローカル ファイルを参照するように XSLT ファイルを変更する必要がありますか、それとも別の方法で行うことができますか?
以下のコメントに加えて、xsl ファイルの抜粋を次に示します。外部ファイルを参照する唯一の場所です。
<!--
XML output, with a DOCTYPE refering the timewise DTD.
Here we use the full Internet URL.
-->
<xsl:output method="xml" indent="yes" encoding="UTF-8"
omit-xml-declaration="no" standalone="no"
doctype-system="http://www.musicxml.org/dtds/timewise.dtd"
doctype-public="-//Recordare//DTD MusicXML 2.0 Timewise//EN" />
言及された手法はこれにも有効ですか?
DTD ファイルには、次のような多数の MOD ファイルへの参照が含まれています。
<!ENTITY % layout PUBLIC
"-//Recordare//ELEMENTS MusicXML 2.0 Layout//EN"
"layout.mod">
これらのファイルも順番にインポートされると思います。