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

时间:2011-10-27 11:54:04

标签: extension-methods xslt umbraco xslcompiledtransform

我正在尝试使用可变数量的参数实现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中以某种方式转换,但我无法弄清楚如何。有什么建议吗?

1 个答案:

答案 0 :(得分:4)

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

  1. .NET documentation
  2. 中指定的扩展功能不支持使用params关键字的方法
      

    <强>说明

         

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

    0.2。仅允许某些类型作为扩展功能的参数。这些定义为 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