I have this Saxon C# method that takes in an input XML node, and and a string containing an XSLT 2.0 that I generated in MapForce. This function works fine with one XML input node, but I've recently created a mapping with multiple inputs (i.e. 2 xml files and 1 output). So I need to modify the Saxon code to become aware of another input node. However, the XsltTransformer class only seems to have an "InitialContextNode" property and nothing else to specify additional context nodes. Is anyone familiar with how to get the XsltTransformer class to see other XML nodes? Thanks.
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();
}
So basically what I need is something like this:
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());
}
}
XSLT code with 2 inputs for reference: http://pastebin.com/04ZTRe6m