Saxon 在 XSLT 中调用 C# 函数

Call C# function in XSLT by 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(); 

我尝试使用 saxon9he-api 的 XSLT 2.0,如下所示:

 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

但是这段代码有以下错误:

Cannot find a matching 0-argument function named {urn:my-scripts}Test()

我读了很多 post 但我没有找到解决这个问题的方法。

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

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

您必须 re-write 在 Java 和 中现有的基于 C# 的扩展函数(参见下面的评论)切换到Saxon自己专有的扩展机制。

阅读