我在C#项目中有一个XSLT文件,如下所示:
<msxsl:script language="C#" implements-prefix="user">
<![CDATA[
public string Test()
{
return "test1";
}
]]>
</msxsl:script>
...
<xsl:value-of select="user:Test()"/>
我通过这个XSLT转换了我的XML文件,如下所示:
//Enable execute C# function in xslt
var Xsltsettings = new XsltSettings();
Xsltsettings.EnableScript = true;
XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(XslFile, Xsltsettings, new XmlUrlResolver());
// get transformed results
StringWriter sw = new StringWriter();
XsltArgumentList xslarg = new XsltArgumentList();
xsl.Transform(xdoc, xslarg, sw);
sw.Close();
我尝试使用XSLT 2.0 saxon9he-api ,如下所示:
Processor processor = new Processor();
// Load the source document.
string sourceUri = @"D:\testXML.xml";
XdmNode input = processor.NewDocumentBuilder().Build(new Uri(sourceUri));
// Create a transformer for the stylesheet.
string xsltUri = @"D:\testXSLT.xslt";
XsltTransformer transformer = processor.NewXsltCompiler().Compile(new Uri(xsltUri)).Load();
// Set the root node of the source document to be the initial context node.
transformer.InitialContextNode = input;
Serializer serializer = new Serializer();
StringBuilder sb = new StringBuilder();
TextWriter writer = new StringWriter(sb);
serializer.SetOutputWriter(writer);
transformer.Run(serializer); //Error line
但是这段代码有以下错误:
找不到名为{urn:my-scripts} Test()
的匹配0参数函数
我读过很多帖子,但我找不到解决这个问题的方法。
如果有人能解释这个问题的解决方案,那将非常有帮助。
答案 0 :(得分:3)
Saxon不支持专有的Microsoft扩展。 XSLT扩展通常不能在不同类型的处理器之间移植。
你必须用Java重新编写现有的基于C#的扩展函数和 (见下面的评论)切换到Saxon自己的专有扩展机制。
阅读