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'), '')"/>