我有这个Saxon C#方法,它接受一个输入XML节点,以及一个包含我在MapForce中生成的XSLT 2.0的字符串。这个函数适用于一个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
答案 0 :(得分: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));
}
似乎效率低下(因为您将XElement序列化为字符串以解析字符串),XmlReader
超过XElement
的正常方法就是
foreach (XElement input in inputXML) {
using (XmlReader xr = input.CreateReader())
{
nodes.Add(processor.NewDocumentBuilder().Build(xr));
}
}