C# 如何在Saxon-HE中使用XSLT-fn:document函数?
如何在Saxon-HE中使用XSLT-fn:document函数?我知道.net可以通过Xml解析器使用“EnableDocumentFunction”。在下面的代码中如何/在何处插入XmlResolverC# 如何在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
#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,非常感谢您的帮助,它对我来说工作得很好