由Saxon在XSLT中调用C#函数

时间:2017-01-24 14:56:15

标签: c# xslt saxon

我在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参数函数

我读过很多帖子,但我找不到解决这个问题的方法。

如果有人能解释这个问题的解决方案,那将非常有帮助。

1 个答案:

答案 0 :(得分:3)

Saxon不支持专有的Microsoft扩展。 XSLT扩展通常不能在不同类型的处理器之间移植。

你必须用Java重新编写现有的基于C#的扩展函数和 (见下面的评论)切换到Saxon自己的专有扩展机制。

阅读