C # XSLT помощник с параметрами - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть 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);

Oneсценариев 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 Ответ

1 голос
/ 28 апреля 2011

Что ж, в документации по 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'), '')"/>
...