C# 如何在Saxon-HE中使用XSLT-fn:document函数?

C# 如何在Saxon-HE中使用XSLT-fn:document函数?,c#,.net,xml,xslt,saxon,C#,.net,Xml,Xslt,Saxon,如何在Saxon-HE中使用XSLT-fn:document函数?我知道.net可以通过Xml解析器使用“EnableDocumentFunction”。在下面的代码中如何/在何处插入XmlResolver #region "saxon" public static StringWriter saxonmethod(string sourceFile, Stream XSLT) { Processor processor = new Processor(); TextReade

如何在Saxon-HE中使用XSLT-fn:document函数?我知道.net可以通过Xml解析器使用“EnableDocumentFunction”。在下面的代码中如何/在何处插入XmlResolver

#region "saxon"
public static StringWriter saxonmethod(string sourceFile, Stream XSLT)
{
    Processor processor = new Processor();

    TextReader stringReader = new StringReader(sourceFile);
    XmlTextReader reader2 = new XmlTextReader(stringReader);
    reader2.XmlResolver = null;// Load the source document
    XdmNode input = processor.NewDocumentBuilder().Build(reader2);


    // Create a transformer for the stylesheet.
    XsltTransformer transformer = processor.NewXsltCompiler().Compile(XSLT).Load();
    transformer.InputXmlResolver = null;

    // Set the root node of the source document to be the initial context node
    transformer.InitialContextNode = input;

    // Create a serializer
    StringWriter s = new StringWriter();
    Serializer serializer = new Serializer();//serializer.SetOutputWriter(Console.Out);
    serializer.SetOutputWriter(s);

    // Transform the source XML to System.out.
    transformer.Run(serializer);
    return s;
}

#endregion

谢谢你。Saran

尝试简单地删除transformer.InputXmlResolver=null行,那么我认为
文档/doc
应该可以工作。如果没有,则可以设置transformer.InputXmlResolver=new XmlUrlResolver()

您没有说明样式表在做什么,或者它是如何失败的,所以我们在这里工作,而不是在黑暗中。我猜document()调用的参数是一个相对URI,它失败了,因为没有已知的基URI,或者基URI不正确。默认情况下,document()使用样式表的基本URI,当从流加载样式表时,这是未知的,因此您需要在XSLT编译器上设置BaseUri属性。

Hi感谢您的快速回复。我的XML。我的Xslt调用document()函数,但从未工作过,当从Oxygen转换时,它对我来说工作得很好:好的,您调用document()提供一个节点作为参数,在这种情况下,该节点的基本URI起作用。因此,您需要设置用于构建源文档的DocumentBuilder的BaseUri属性。或者,不必费心创建XmlTextReader,直接从文件中构建(),Saxon就会知道基本URI是该文件的位置。嗨,Michael Kay,我还有一个疑问,我的xslt使用了“exslt”,所以我得到了Saxon.Api.DynamicError,“找不到匹配的名为{}node-set()的单参数函数”。没有本地名称节点集为“”的Saxon扩展函数,请帮助解决。@saravanans,请尽量组织有序一点。这看起来是一个完全无关的问题,所以请把它作为一个新问题提出来。解释您试图实现的目标、编写的代码、使用的XSLT处理器和版本以及失败的原因。嗨,Martin,我对相关问题还有一个疑问,我的XSLT使用了“exslt”,因此我得到了Saxon.Api.DynamicError,“找不到名为{}node-set()的匹配单参数函数”。没有本地名称节点集为“”的Saxon扩展函数,请帮助解决。@saravanans,这是一个完全不同的问题,您应该为此提出一个新问题。但是在XSLT2.0中不需要这个函数,所以只需使用例如
exsl:node set($var)
替换为例如
$var
。嗨,Margin,非常感谢您的帮助,它对我来说工作得很好