Saxon C#XSLT 2.0,带有多个输入xml文件

时间:2013-12-27 19:54:40

标签: c# xslt-2.0 saxon map-force

我有这个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

1 个答案:

答案 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));
        }
    }