c# - 带有 C# 扩展函数的 XSLT 中的错误消息

标签 c# clr extension-methods xslt

我在尝试在 XSLT 中实现 C# 扩展函数时收到以下错误。

Extension function parameters or return values which have CLR type 'Char[]' are not supported.**

代码:

<xsl:variable name="stringList">
  <xsl:value-of select="extension:GetList('AAA BBB CCC', ' ')"/>
</xsl:variable> 

<msxsl:script language="C#" implements-prefix="extension">
<![CDATA[

public string[] GetList(string str, char[] delimiter)
{
   ...
   ...
   return str.Split(delimiter, StringSplitOptions.None);
}

]]>
</msxsl:script>

谁能解释这个错误消息以及如何克服它?

编辑:我需要一个解决方案,它仍然可以让我实现拆分功能并利用返回的数组。

谢谢!

最佳答案

XSLT 扩展方法必须返回 XSL 转换中支持的类型。下表显示了 W3C XPath 类型及其对应的 .NET 类型:

W3C XPath Type        | Equivalent .NET Class (Type)
------------------------------------------------------
String                | System.String
Boolean               | System.Boolean
Number                | System.Double
Result Tree Fragment  | System.Xml.XPath.XPathNavigator
Node Set              | System.Xml.XPath.XPathNodeIterator

The table is taken from the section Mapping Types between XSLT and .NET in this MSDN Magazine article.

Instead of returning a string[] array you would have to return an XPathNodeIterator like it is done in the following example:

<msxsl:script implements-prefix="extension" language="C#">
<![CDATA[

public XPathNodeIterator GetList(string str, string delimiter)
{
    string[] items = str.Split(delimiter.ToCharArray(), StringSplitOptions.None);
    XmlDocument doc = new XmlDocument();
    doc.AppendChild(doc.CreateElement("root"));
    using (XmlWriter writer = doc.DocumentElement.CreateNavigator().AppendChild())
    {
        foreach (string item in items)
        {
            writer.WriteElementString("item", item);
        }
    }
    return doc.DocumentElement.CreateNavigator().Select("item");
}
]]>
</msxsl:script>

然后在您的 XSL 转换中,您可以使用 xsl:for-each 迭代返回的节点集中的元素:

<xsl:template match="/">
    <root>
        <xsl:for-each select="extension:GetList('one,two,three', ',')">
            <value>
                <xsl:value-of select="."/>
            </value>
        </xsl:for-each>
    </root>
</xsl:template>

关于c# - 带有 C# 扩展函数的 XSLT 中的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3046898/

相关文章:

c# - 松散的 XAML 是根据引用的命名空间加载的 .NET/CLR 版本吗?

c# - 无法在 Azure DevOps 2019 中通过代码创建代理池(无权限)

c# - 调用 Thread.SpinWait 时会内联吗?

java - CLR 是否与 Java(作为一种语言)不兼容?

.net - 如何模拟(使用最小起订量)Unity 方法

c# - 仅在使用 LINQ 时引用需要错误

c# - Azure 发布 :a runtime component is missing:/base/x64/IISConfigurator. exe

c# mvc 如何将根 url 映射到特定 View

c# - asp.net core api模型中的datetimeoffset

c# - 我将如何为 System.Data.Linq.Table<T> 编写扩展方法?