1

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

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

concat但是 Umbraco 有一个以这种方式运行的内置函数。我查看了 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 个参数的匹配“测试”方法。

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

4

1 回答 1

4

您正在做的事情有两个问题

  1. params不支持将带有关键字的方法作为扩展函数,如.NET 文档中所述:

评论

目前不支持允许传递未指定数量的参数的 params 关键字。使用以 params 关键字定义的方法的 XSLT 样式表无法正常工作。有关详细信息,请参阅参数(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
于 2011-10-27T12:51:34.653 回答