Teilen über


Skriptblöcke mit msxsl:script

Hinweis

Skriptblöcke werden nur in .NET Framework unterstützt. Sie werden auf .NET Core oder .NET 5 oder höher nicht unterstützt.

Die XslCompiledTransform Klasse unterstützt eingebettete Skripts mithilfe des msxsl:script Elements. Wenn das Stylesheet geladen wird, werden alle definierten Funktionen durch das Code Document Object Model (CodeDOM) in die allgemeine Zwischensprache (CIL) kompiliert und während der Laufzeit ausgeführt. Die aus dem eingebetteten Skriptblock generierte Assembly ist getrennt als die assembly, die für das Stylesheet generiert wurde.

Xslt-Skript aktivieren

Die Unterstützung für eingebettete Skripts ist eine optionale XSLT-Einstellung für die XslCompiledTransform Klasse. Die Skriptunterstützung ist standardmäßig deaktiviert. Um die Skriptunterstützung zu aktivieren, erstellen Sie ein XsltSettings Objekt mit dem EnableScript Eigenschaftensatz, true und übergeben Sie das Objekt an die Load Methode.

Warnung

Ab .NET 10 wird die EnableScript Eigenschaft als veraltet markiert und generiert Warnungen SYSLIB0062. Da Skriptblöcke unter .NET Core oder .NET 5+ nicht unterstützt werden, hat diese Eigenschaft keine Auswirkung. Wenn sie auf true gesetzt wird, wird zur Laufzeit eine PlatformNotSupportedException ausgelöst.

Hinweis

XSLT-Skripting sollte nur aktiviert werden, wenn Sie Skriptunterstützung benötigen und in einer voll vertrauenswürdigen Umgebung arbeiten.

msxsl:script-Elementdefinition

Das msxsl:script Element ist eine Microsoft-Erweiterung für die XSLT 1.0-Empfehlung und hat die folgende Definition:

<msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script>

Das msxsl Präfix ist an den urn:schemas-microsoft-com:xslt Namespace-URI gebunden. Das Stylesheet muss die xmlns:msxsl=urn:schemas-microsoft-com:xslt Namespacedeklaration enthalten.

Das attribut language ist optional. Der Wert ist die Codesprache des eingebetteten Codeblocks. Die Sprache wird dem entsprechenden CodeDOM-Compiler mithilfe der CodeDomProvider.CreateProvider Methode zugeordnet. Die XslCompiledTransform Klasse kann jede Microsoft .NET-Sprache unterstützen, vorausgesetzt, der entsprechende Anbieter ist auf dem Computer installiert und wird im Abschnitt "system.codedom" der datei machine.config registriert. Wenn kein language Attribut angegeben ist, wird die Sprache standardmäßig auf JScript festgelegt. Bei dem Sprachnamen wird die Groß-/Kleinschreibung nicht beachtet, sodass "JavaScript" und "javascript" gleichwertig sind.

Das implements-prefix Attribut ist obligatorisch. Dieses Attribut wird verwendet, um einen Namespace zu deklarieren und ihn dem Skriptblock zuzuordnen. Der Wert dieses Attributs ist das Präfix, das den Namespace darstellt. Dieses Präfix kann an einer beliebigen Stelle in einem Stylesheet definiert werden.

Hinweis

Bei Verwendung des msxsl:script Elements wird dringend empfohlen, das Skript unabhängig von der Sprache in einem CDATA-Abschnitt zu platzieren. Da das Skript Operatoren, Bezeichner oder Trennzeichen für eine bestimmte Sprache enthalten kann, hat es das Potenzial, als XML falsch interpretiert zu werden, wenn es nicht in einem CDATA-Abschnitt enthalten ist. Der folgende XML-Code zeigt eine Vorlage des CDATA-Abschnitts, in dem Code platziert werden kann.

<msxsl:script implements-prefix='your-prefix' language='CSharp'>
<![CDATA[
// Code block.
]]>
</msxsl:script>

Skriptfunktionen

Funktionen können innerhalb des msxsl:script Elements deklariert werden. Wenn eine Funktion deklariert wird, ist sie in einem Skriptblock enthalten. Stylesheets können mehrere Skriptblöcke enthalten, die jeweils unabhängig vom anderen ausgeführt werden. Dies bedeutet, dass Sie, wenn Sie innerhalb eines Skriptblocks ausgeführt werden, keine Funktion aufrufen können, die Sie in einem anderen Skriptblock definiert haben, es sei denn, sie ist deklariert, dass sie über denselben Namespace und dieselbe Skriptsprache verfügt. Da sich jeder Skriptblock in einer eigenen Sprache befinden kann und der Block gemäß den Grammatikregeln dieser Sprachparser analysiert wird, wird empfohlen, die richtige Syntax für die verwendete Sprache zu verwenden. Wenn Sie sich beispielsweise in einem Microsoft C#-Skriptblock befinden, verwenden Sie die C#-Kommentarsyntax.

Die angegebenen Argumente und Rückgabewerte an die Funktion können beliebiger Art sein. Da die W3C XPath-Typen eine Teilmenge der ClR-Typen (Common Language Runtime) sind, erfolgt die Typkonvertierung für Typen, die nicht als XPath-Typ gelten. Die folgende Tabelle zeigt die entsprechenden W3C-Typen und den entsprechenden CLR-Typ.

W3C-Typ CLR-Typ
String String
Boolean Boolean
Number Double
Result Tree Fragment XPathNavigator
Node Set XPathNodeIterator

Die numerischen CLR-Typen werden in Double konvertiert. Der DateTime-Typ wird in String umgewandelt. Die IXPathNavigable-Typen werden in XPathNavigator umgewandelt. XPathNavigator[] wird in XPathNodeIterator umgewandelt.

Alle anderen Typen lösen einen Fehler aus.

Importieren von Namespaces und Assemblys

Die XslCompiledTransform Klasse vordefinierte eine Reihe von Assemblys und Namespaces, die standardmäßig vom msxsl:script Element unterstützt werden. Sie können jedoch Klassen und Member verwenden, die zu einem Namespace gehören, der nicht in der vordefinierten Liste enthalten ist, indem Sie die Assembly und den Namespace im msxsl:script Block importieren.

Assemblys

Auf die folgenden beiden Assemblys wird standardmäßig verwiesen:

  • System.dll
  • System.Xml.dll
  • Microsoft.VisualBasic.dll (wenn die Skriptsprache VB ist)

Sie können die zusätzlichen Assemblys mithilfe des msxsl:assembly Elements importieren. Dies gilt auch für die Assembly beim Kompilieren des Stylesheets. Das msxsl:assembly Element hat die folgende Definition:

<msxsl:script>
  <msxsl:assembly name="system.assemblyName" />
  <msxsl:assembly href="path-name" />
    <![CDATA[
    // User code
    ]]>
</msxsl:script>

Das name Attribut enthält den Namen der Assembly, und das href Attribut enthält den Pfad zur Assembly. Der Assemblyname kann ein vollständiger Name sein, z. B. "System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" oder einen kurzen Namen, z. B. "System.Web".

Namensräume

Die folgenden Namespaces sind standardmäßig enthalten:

  • System
  • System.Collection
  • System.Text
  • System.Text.RegularExpressions
  • System.Xml
  • System.Xml.Xsl
  • System.Xml.XPath
  • Microsoft.VisualBasic (wenn die Skriptsprache VB ist)

Sie können mithilfe des namespace Attributs Unterstützung für zusätzliche Namespaces hinzufügen. Der Attributwert ist der Name des Namespace.

<msxsl:script>
  <msxsl:using namespace="system.namespaceName" />
    <![CDATA[
    // User code
    ]]>
</msxsl:script>

Beispiel

Im folgenden Beispiel wird ein eingebettetes Skript verwendet, um den Umfang eines Kreises anhand seines Radius zu berechnen.

using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;

public class Sample {

  private const String filename = "number.xml";
  private const String stylesheet = "calc.xsl";

  public static void Main() {

    // Compile the style sheet.
    XsltSettings xslt_settings = new XsltSettings();
    xslt_settings.EnableScript = true;
    XslCompiledTransform xslt = new XslCompiledTransform();
    xslt.Load(stylesheet, xslt_settings, new XmlUrlResolver());

    // Load the XML source file.
    XPathDocument doc = new XPathDocument(filename);

    // Create an XmlWriter.
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;
    settings.Indent = true;
    XmlWriter writer = XmlWriter.Create("output.xml", settings);

    // Execute the transformation.
    xslt.Transform(doc, writer);
    writer.Close();
  }
}
Imports System.IO
Imports System.Xml
Imports System.Xml.XPath
Imports System.Xml.Xsl

Public class Sample

    Private Const filename As String = "number.xml"
    Private Const stylesheet As String = "calc.xsl"

    Public Shared Sub Main()

        ' Compile the style sheet.
        Dim xslt_settings As XsltSettings = New XsltSettings()
        xslt_settings.EnableScript = true
        Dim xslt As XslCompiledTransform = New XslCompiledTransform()
        xslt.Load(stylesheet, xslt_settings, New XmlUrlResolver())

        ' Load the XML source file.
        Dim doc As XPathDocument = New XPathDocument(filename)

        ' Create an XmlWriter.
        Dim settings As XmlWriterSettings = New XmlWriterSettings()
        settings.OmitXmlDeclaration = true
        settings.Indent = true
        Dim writer As XmlWriter = XmlWriter.Create("output.xml", settings)

        ' Execute the transformation.
        xslt.Transform(doc, writer)
        writer.Close()
    End Sub
End Class

number.xml

<?xml version='1.0'?>
<data>
  <circle>
    <radius>12</radius>
  </circle>
  <circle>
    <radius>37.5</radius>
  </circle>
</data>

calc.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:user="urn:my-scripts">
  <msxsl:script language="C#" implements-prefix="user">
  <![CDATA[
  public double circumference(double radius){
    double pi = 3.14;
    double circ = pi*radius*2;
    return circ;
  }
  ]]>
  </msxsl:script>
  <xsl:template match="data">
    <circles>
      <xsl:for-each select="circle">
        <circle>
          <xsl:copy-of select="node()"/>
          <circumference>
            <xsl:value-of select="user:circumference(radius)"/>
          </circumference>
        </circle>
      </xsl:for-each>
    </circles>
  </xsl:template>
</xsl:stylesheet>

Ausgabe

<circles xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:user="urn:my-scripts">
  <circle>
    <radius>12</radius>
    <circumference>75.36</circumference>
  </circle>
  <circle>
    <radius>37.5</radius>
    <circumference>235.5</circumference>
  </circle>
</circles>

Siehe auch