C# XSLT помощник с параметрами

У меня есть xsl view engine и я хочу вызвать стандартные помощники вида (например, UrlHelper.Action) из xsl. Но мне не удалось передать переменные числа параметров в вспомогательные методы.

Вспомогательный класс:

namespace Services
{
    public class ViewHelper
    {
        // ...

        public string DummyHelper(params string[] dummyArgs)
        {
            return String.Concat(dummyArgs);
        }
    }
}

Добавление вспомогательной поддержки для преобразования xsl:

var xsl = new XslCompiledTransform();
xsl.Load('MyView.xsl');
varc xsltArgs = new XsltArgumentList();
// Create helper, pass controller context as a param
var helper = new Services.ViewHelper(context));
xslt.AddExtensionObject("urn:helper", helper);
xsl.Transform(xmlDocument, xsltArgs, output);

Один из сценариев xsl, использующий помощник:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
    xmlns:h ="urn:helper"
    exclude-result-prefixes="h msxsl"
>
    <xsl:template match="/">
        <xsl:value-of select="h:DummyHelper('lorem', 'ipsum', 'dolor', 'sit', 'amet')"/>
    </xsl:template>
</xsl:stylesheet>

Исключение возникает с сообщением, которое гласит: не удается найти mthod DummyHelper с 5 аргументами.

1 ответ

Решение

В документации по адресу http://msdn.microsoft.com/en-us/library/tf741884.aspx четко сказано: "Любой метод, определенный с помощью ключевого слова params, позволяющий передавать неопределенное количество параметров, в настоящее время не существует. поддерживается классом XslCompiledTransform." так что то, что вы хотите, не поддерживается. В зависимости от ваших потребностей вы можете подумать, возможно ли реализовать эту функциональность с помощью чистого XSLT 2.0 и одного из процессоров.NET XSLT 2.0, таких как Saxon 9 или XQSharp. XSLT 2.0 намного более мощный, чем XSLT 1.0, и позволяет вам писать функции с xsl:function в чистом XSLT. Для вашего образца вы могли бы просто сделать

<xsl:value-of select="'lorem', 'ipsum', 'dolor', 'sit', 'amet'" separator=""/>

в XSLT 2.0 или также

<xsl:value-of select="string-join(('lorem', 'ipsum', 'dolor', 'sit', 'amet'), '')"/>
Другие вопросы по тегам