Java で本のデータベース アプリケーションを作成します。XML 形式で保存された本。すべての本は XML です。本には短編小説を含めることができ、短編小説は XML にすることができます。その場合、本は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
...
<book>
<content>
<xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="shortStory.xml"/>
</content>
</book>
ユーザーがアップロードできる xml は 1 つだけであり、"shortStory.xml" (常に以前にアップロードされた shortStory.xml) なしの "book.xml" である可能性があるため、xinclude を使用せずに XSLT 変換を実行する必要があります。(2 つのファイルが同じパスでない場合)
しかし、アップロード後 (他のユースケース)、XInclude を使用して XSLT 変換を行う必要があります (2 つのファイルは同じパスです)。
Xinclude を使用するすべてのソリューションは、Transformerfactory からインスタンスを取得する前にシステム プロパティを設定します。
System.setProperty(
"org.apache.xerces.xni.parser.XMLParserConfiguration",
"org.apache.xerces.parsers.XIncludeParserConfiguration");
または、DocumentBuilderFactory.setXIncludeAware() を使用します。
2 つの javax.xml.transform.Transformer で xinclude を使用するセットアップと xinclude を使用しないセットアップが必要です。または、xinclude をオン/オフするための javax.xml.transform.stream.StreamSource の単純な方法である 1 つの transformt です。
ありがとう
編集
Martin Honnen のソリューションを試してみましたが、変換に問題があったため、SAXreader を Documentbuilder に変更しました。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setXIncludeAware(true);
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document doc = docBuilder.parse(input);
Source source = new DOMSource(doc);
...
transformer.transform(source, result);