如何在Saxon-HE中使用XSLT fn:document函数来读取XML字符串?

时间:2013-10-03 19:06:33

标签: .net xml xslt xpath saxon

我正在使用Saxon-HE的.net版本。

我编写了一些代码来设置XSLT转换,其中源XSLT从外部传入(不是在运行时从文件中读取)。

以下是我的代码片段:

Saxon.Api.Processor processor = new Saxon.Api.Processor();

// Feed the XSLT into Saxon
XmlDocument document = new XmlDocument();
document.LoadXml(xslt);
Saxon.Api.XdmNode input = processor.NewDocumentBuilder().Build(document);
Saxon.Api.XsltCompiler xsltCompiler = processor.NewXsltCompiler();
Saxon.Api.XsltExecutable xsltExecutable = xsltCompiler.Compile(input);
Saxon.Api.XsltTransformer xsltTransformer = xsltExecutable.Load();

// Create The stream that will contain the transformed XML.
MemoryStream transformedXmlStream = new MemoryStream();
xsltTransformer.InputXmlResolver = null;
// Input the XML into the transformer.
xsltTransformer.InitialContextNode = processor.NewDocumentBuilder().Build(inputXml);
// Set up the serializer that will output the result.
Saxon.Api.Serializer dataSerializer = processor.NewSerializer(transformedXmlStream);
// Run the transformation and get the output as a stream.
xsltTransformer.Run(dataSerializer);

此代码到目前为止效果很好!

但是,我遇到了新要求的问题。我被要求使用document()函数实现一些功能,这需要另一个带有自己的BaseURI的XML文档。

这个其他文档将作为字符串或流直接提供给程序,就像XSLT和输入XML一样。问题是我难以理解如何将文档提供给Saxon,这将由document()函数引用。

如何使用document()函数读取Saxon XSLT中的XML流?

1 个答案:

答案 0 :(得分:1)

将xsltTransformer的InputXmlResolver属性设置为XmlResolver,该XmlResolver识别传递给document()函数的URI并返回相应的输入流。