0

我有 xsl 视图引擎并想从 xsl 调用标准视图助手(例如 UrlHelper.Action)。但是我未能将参数的可变成员传递给辅助方法。

助手类:

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>

引发异常并显示消息:找不到具有 5 个参数的 mthod DummyHelper。

4

1 回答 1

1

好吧, http: //msdn.microsoft.com/en-us/library/tf741884.aspx上的文档清楚地说明了“使用 params 关键字定义的任何方法,它允许传递未指定数量的参数,目前不是XslCompiledTransform 类支持。” 所以不支持你想要的。根据您的需要,您可以考虑是否可以使用纯 XSLT 2.0 和Saxon 9XQSharp等 .NET XSLT 2.0 处理器之一来实现该功能。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'), '')"/>
于 2011-04-28T12:33:17.223 回答