入力 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