Метод расширения XSLT с переменным числом аргументов - PullRequest
1 голос
/ 27 октября 2011

Я пытаюсь реализовать функцию расширения XSLT с переменным числом аргументов.Если я объявляю параметр как массив, массив параметров, 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» не содержит соответствующий метод «Test», который имеет 3 параметра.

Я предполагаю, что ввод concat каким-то образом преобразован в XPathNodeIterator, но я не могучтобы понять, как.Есть предложения?

1 Ответ

4 голосов
/ 27 октября 2011

Есть две проблемы с тем, что вы делаете :

  1. Методы с ключевым словом params не поддерживаются в качестве функций расширения, как указано в документации .NET :

Примечания

Ключевое слово params, позволяющее передавать неопределенное количество параметров, в настоящее время не поддерживается. Таблицы стилей XSLT, которые использовать методы, определенные с помощью ключевого слова params, не работает правильно. Для получения дополнительной информации см. Params (C # Reference).

0,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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...