具有可变数量参数的 XSLT 扩展方法

发布于 2024-12-12 02:53:11 字数 826 浏览 0 评论 0原文

我正在尝试实现具有可变数量参数的 XSLT 扩展函数。如果我将参数声明为数组、params 数组、ICollection 等,则会收到以下错误(其中 TYPE_NAME 是使用的类型):

System.Xml.Xsl.XslTransformException:具有 Clr 类型的扩展函数参数或返回值不支持“TYPE_NAME”。

但 Umbraco 有一个内置函数 concat 就是以这种方式运行的。我查看了 Umbraco 的源代码,它看起来像这样:

public static string concat(XPathNodeIterator nodeset){...}

在 XSLT 中它是这样调用的:

concat('a', 'b', 'c')

当我尝试类似的方法并按如下方式声明我的函数时:

public static string Test(XPathNodeIterator nodeset){...}

并以相同的方式在 XSLT 中调用它:

Custom:Test('a', 'b', 'c')

我收到以下错误:

System.Xml.Xsl.XslTransformException:扩展对象“urn:Custom”不包含具有 3 个参数的匹配“Test”方法。

我猜 concat 的输入在 XPathNodeIterator 中以某种方式进行了转换,但我无法弄清楚如何转换。有什么建议吗?

I'm trying to implement an XSLT extension function with variable number of arguments. If I declare the parameter as an array, a params array, a ICollection, etc. I get the following error (where TYPE_NAME is the type used):

System.Xml.Xsl.XslTransformException: Extension function parameters or return values which have Clr type 'TYPE_NAME' are not supported.

But the Umbraco has a built-in function concat which functions in this way. I looked in Umbraco's source and it looks like this:

public static string concat(XPathNodeIterator nodeset){...}

and in XSLT it is called like this:

concat('a', 'b', 'c')

When I try a similar approach and declare my function as follows:

public static string Test(XPathNodeIterator nodeset){...}

and call it in XSLT in the same way:

Custom:Test('a', 'b', 'c')

I get the following error:

System.Xml.Xsl.XslTransformException: Extension object 'urn:Custom' does not contain a matching 'Test' method that has 3 parameter(s).

I guess the input of concat is somehow transformed in XPathNodeIterator but I am unable to figure how. Any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

﹂绝世的画 2024-12-19 02:53:11

您正在执行的操作存在两个问题

  1. 不支持使用 params 关键字的方法作为扩展函数,如 .NET 文档

备注

目前不支持允许传递未指定数量的参数的 params 关键字。 XSLT 样式表
利用 params 关键字定义的方法不起作用
正确。有关详细信息,请参阅参数(C# 参考)。

.2.仅允许某些类型作为扩展函数的参数。这些定义在此处

W3C type             Equivalent .NET class (type)             XPath or XSLT type

String                     System.String                           XPath

Boolean                    System.Boolean                          XPath

Number                     System.Double                           XPath

Result Tree Fragment       System.Xml.XPath.XPathNavigator         XSLT

Node*                      System.Xml.XPath.XPathNavigator         XPath

Node Set                   XPathNodeIterator or XPathNavigator[]   XPath

There are two problems with what you are doing:

  1. Methods with the params keyword are not supported as extension functions, as specified in the .NET documentation:

Remarks

The params keyword, which allows an unspecified number of parameters to be passed, is currently not supported. XSLT style sheets that
utilize methods defined with the params keyword does not work
correctly. For more information, see params (C# Reference).

.2. Only certain types are allowed as parameters for extension functions. These are defined here:

W3C type             Equivalent .NET class (type)             XPath or XSLT type

String                     System.String                           XPath

Boolean                    System.Boolean                          XPath

Number                     System.Double                           XPath

Result Tree Fragment       System.Xml.XPath.XPathNavigator         XSLT

Node*                      System.Xml.XPath.XPathNavigator         XPath

Node Set                   XPathNodeIterator or XPathNavigator[]   XPath
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文