0

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);
4

1 に答える 1

0

これは、XSLT プロセッサよりも XML パーサーに関する質問だと思います。http://xerces.apache.org/xerces2-j/features.htmlによると、設定できます

import javax.xml.parsers.SAXParser;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

SAXParser parser = /* created from SAXParserFactory */;
XMLReader reader = parser.getXMLReader();
try {
    reader.setFeature("http://apache.org/xml/features/xinclude", 
                      true);
} 
catch (SAXException e) {
    System.err.println("could not set parser feature");
}

次に、そのリーダーで SAXSource を構築できます。

SAXSource source = new SAXSource();
source.setXMLReader(reader);

そうすれば、システム プロパティを設定する必要なく、XInclude をオンまたはオフにしてソースをビルドすることができます。

于 2014-06-25T16:46:11.610 に答える