1

入力 XML ノードを受け取るこの Saxon C# メソッドと、MapForce で生成した XSLT 2.0 を含む文字列があります。この関数は 1 つの XML 入力ノードで問題なく動作しますが、最近、複数の入力 (つまり、2 つの xml ファイルと 1 つの出力) を持つマッピングを作成しました。そのため、Saxon コードを変更して、別の入力ノードを認識できるようにする必要があります。ただし、XsltTransformer クラスには「InitialContextNode」プロパティのみがあり、追加のコンテキスト ノードを指定するものは何もないようです。XsltTransformer クラスを取得して他の XML ノードを表示する方法を知っている人はいますか? ありがとう。

 public static string transform(string inputXML, string transformText) {
    Processor processor = new Processor();
    TextReader stringReader = new StringReader(inputXML);
    XmlTextReader reader2 = new XmlTextReader(stringReader);
    reader2.XmlResolver = null;
    XdmNode input = processor.NewDocumentBuilder().Build(reader2);
    XsltTransformer transformer = processor.NewXsltCompiler().Compile(new StringReader(transformText)).Load();
    transformer.InputXmlResolver = null;
    transformer.InitialContextNode = input;
    Serializer serializer = new Serializer();
    StringBuilder sb = new StringBuilder();
    TextWriter txt = new StringWriter(sb);
    serializer.SetOutputWriter(txt);
    transformer.Run(serializer);
    return sb.ToString();
}

したがって、基本的に必要なのは次のようなものです。

public static XElement transform(string transformText, params XElement[] inputXML) {
    if (string.IsNullOrEmpty(transformText)) return null;
    else {
        Processor processor = new Processor();
        List<XdmNode> nodes = new List<XdmNode>();
        foreach (XElement input in inputXML) {
            TextReader stringReader = new StringReader(input.ToString());
            XmlTextReader reader2 = new XmlTextReader(stringReader);
            reader2.XmlResolver = null;
            nodes.Add(processor.NewDocumentBuilder().Build(reader2));
        }
        XsltTransformer transformer = processor.NewXsltCompiler().Compile(new StringReader(transformText)).Load();
        transformer.InputXmlResolver = null;
        transformer.InitialContextNode = nodes[0]; // How do I get it to see the other nodes?
        Serializer serializer = new Serializer();
        StringBuilder sb = new StringBuilder();
        TextWriter txt = new StringWriter(sb);
        serializer.SetOutputWriter(txt);
        transformer.Run(serializer);
        return XElement.Parse(sb.ToString());
    }
}

参照用の 2 つの入力を含む XSLT コード: http://pastebin.com/04ZTRe6m

4

1 に答える 1

1

スタイルシートには<xsl:param name="response2" select="'response.xml'"/>、二次入力ドキュメントのファイル名または URL であると思われるグローバル パラメータがあります。入力 XML がその名前のファイルであるresponse.xml場合は何もする必要はありません。別の名前のファイルである場合は、必要に応じてパラメーターを設定してください。後でスタイルシートがdoc($response2)そうするので、URL が必要です。

完全なアプローチを変更し、二次入力を として渡したいXdmNode場合は、スタイルシート コードを変更する必要がありXdmNode、C# コードでパラメーターを に設定する必要があります。XSLT の主な変更点は$response2、スタイルシートが使用する場所を単純に使用することdoc($response2)です。

あなたの質問とは関係ありませんが、私はそれを指摘したいと思います

    foreach (XElement input in inputXML) {
        TextReader stringReader = new StringReader(input.ToString());
        XmlTextReader reader2 = new XmlTextReader(stringReader);
        reader2.XmlResolver = null;
        nodes.Add(processor.NewDocumentBuilder().Build(reader2));
    }

非効率的であるように思わXmlReaderれます (XElement を文字列にシリアル化して文字列を解析するため)。XElement

    foreach (XElement input in inputXML) {
        using (XmlReader xr = input.CreateReader())
        {
          nodes.Add(processor.NewDocumentBuilder().Build(xr));
        }
    }
于 2013-12-28T09:57:54.133 に答える