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自己专有的扩展机制。
阅读
我在 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自己专有的扩展机制。
阅读