5 Stimmen

Fehlermeldung in XSLT mit C#-Erweiterungsfunktion

Ich erhalte folgende Fehlermeldung, wenn ich versuche, eine C#-Erweiterungsfunktion in XSLT zu implementieren.

Parameter von Erweiterungsfunktionen oder Rückgabewerte, die den CLR-Typ "Char[]" haben, werden nicht unterstützt.**

Code:

<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>

Kann jemand diese Fehlermeldung erklären und wie man sie umgehen kann?

EDIT: Ich brauche eine Lösung, die noch lässt mich die Split-Funktion implementieren und verwenden Sie das Array zurückgegeben.

Gracias.

9voto

Dirk Vollmar Punkte 166522

XSLT-Erweiterungsmethoden müssen einen Typ zurückgeben, der in XSL-Transformationen unterstützt wird. Die folgende Tabelle zeigt die W3C-XPath-Typen und ihre entsprechenden .NET-Typen:

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

Die Tabelle stammt aus dem Abschnitt Mapping-Typen zwischen XSLT und .NET hierin Artikel im MSDN-Magazin .

Statt der Rückgabe einer string[] Array müssten Sie eine XPathNodeIterator wie es im folgenden Beispiel geschieht:

<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>

In Ihrer XSL-Transformation können Sie dann über die Elemente in der zurückgegebenen Knotenmenge iterieren, indem Sie 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>

0voto

Von http://msdn.microsoft.com/en-us/library/533texsx(VS.71).aspx

Die übergebenen Argumente und Rückgabewerte, die von den Skriptfunktionen definiert werden, müssen einem der W3C XPath- oder XSLT-Typen entsprechen. Die folgende Tabelle zeigt die entsprechenden W3C-Typen, die äquivalenten .NET-Klassen (Type) und ob der W3C-Typ ein XPath-Typ oder XSLT-Typ ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X