1

このコードは Java であり、Saxon を使用しています

xml およびいくつかのセカンダリ xml ソースを変換する変換関数を実装しています 入力はすべてファイルではないため、document() またはファイルを直接定義する他のメソッドを使用できません

String transform(String xml, List<String> secondaryXmls, String xslt);

変換されたxml結果を出力します

xslt から単一の xml ファイルに変換を適用することには成功していますが、secondaryXmls も利用する変換を適用するのは困難です。私は調査を行いましたが、これらを適用する正しい方法を見つけることができませんでした

ここにコードのスナップショットがあります

    TransformerFactory tFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null);

    Document transformerDoc = loadXMLFromString(xslt);
    Source transformerSource = new DOMSource(transformerDoc);
    Transformer transformer =  tFactory.newTransformer(transformerSource); 

    Document sourceDoc = loadXMLFromString(xml);        
    Source source = new DOMSource(sourceDoc);

    DOMResult result = new DOMResult();
    transformer.transform(source, result);
    Document resultDoc = (Document) result.getNode();

    return getStringFrom(resultDoc);

ありがとう!

編集:

どちらがより良い方法です:

  1. すべての xml を連結し、変換し、連結されたセカンダリ xml をフィルタリングして元の部分のみを返す

  2. 追加するコードを書く

    <xsl:variable name="asd" select="document('asd')">
    

    xslt 文字列の上に

4

1 に答える 1

1

まず最初に、DOM をすべて取り除きます。Saxon で DOM を使用すると、10 倍遅くなります。StreamSource または SAXSource と StreamResult を使用して、Saxon が独自の形式でツリーを構築できるようにします。または、必要に応じて、s9api DocumentBuilder クラスを使用して、Saxon 形式でツリーを自分で構築することもできます。

次に、あなたの質問への答えについては、次の 3 つの解決策があります。

(a) document-node()* 型 (つまり、ドキュメント ノードのシーケンス) のスタイルシート パラメータとしてドキュメントを指定します。Java では、それぞれの Configuration.buildDocument() を呼び出して、XML 文字列のリストをドキュメント ノードのリストに変換します。

(b) URI doc/3 をリストの 3 番目のドキュメントを意味するものとして解釈する効果を持つ URIResolver を作成します。次に、document('doc/3') を使用してそのドキュメントを取得します。

(c) collection() 関数を使用してドキュメントのコレクション全体を利用可能にする CollectionURIResolver を作成します。

于 2013-06-10T21:14:32.123 に答える