Delen via


Scriptblokken met msxsl:script

Notitie

Scriptblokken worden alleen ondersteund in .NET Framework. Ze worden niet ondersteund op .NET Core of .NET 5 of hoger.

De XslCompiledTransform klasse ondersteunt ingesloten scripts met behulp van het msxsl:script element. Wanneer het opmaakmodel wordt geladen, worden alle gedefinieerde functies gecompileerd naar een gemeenschappelijke tussentaal (CIL) door het Code Document Object Model (CodeDOM) en uitgevoerd tijdens de runtime. De assembly die is gegenereerd op basis van het ingesloten scriptblok, is gescheiden van de assembly die is gegenereerd voor het opmaakmodel.

XSLT-script inschakelen

Ondersteuning voor ingesloten scripts is een optionele XSLT-instelling voor de XslCompiledTransform klasse. Scriptondersteuning is standaard uitgeschakeld. Als u scriptondersteuning wilt inschakelen, maakt u een XsltSettings object waarvoor de EnableScript eigenschap is ingesteld true en geeft u het object door aan de Load methode.

Notitie

XSLT-scripts moeten alleen worden ingeschakeld als u scriptondersteuning nodig hebt en u in een volledig vertrouwde omgeving werkt.

msxsl:script element Definition

Het msxsl:script element is een Microsoft-extensie voor de aanbeveling XSLT 1.0 en heeft de volgende definitie:

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

Het msxsl voorvoegsel is gebonden aan de urn:schemas-microsoft-com:xslt naamruimte-URI. Het opmaakmodel moet de xmlns:msxsl=urn:schemas-microsoft-com:xslt naamruimtedeclaratie bevatten.

Het language kenmerk is optioneel. De waarde is de codetaal van het ingesloten codeblok. De taal wordt toegewezen aan de juiste CodeDOM-compiler met behulp van de CodeDomProvider.CreateProvider methode. De XslCompiledTransform klasse kan elke Microsoft .NET-taal ondersteunen, ervan uitgaande dat de juiste provider is geïnstalleerd op de computer en is geregistreerd in de sectie system.codedom van het bestand machine.config. Als er language geen kenmerk is opgegeven, wordt de taal standaard ingesteld op JScript. De taalnaam is niet hoofdlettergevoelig, dus 'JavaScript' en 'javascript' zijn gelijkwaardig.

Het implements-prefix kenmerk is verplicht. Dit kenmerk wordt gebruikt om een naamruimte te declareren en deze te koppelen aan het scriptblok. De waarde van dit kenmerk is het voorvoegsel dat de naamruimte vertegenwoordigt. Dit voorvoegsel kan ergens in een opmaakmodel worden gedefinieerd.

Notitie

Wanneer u het msxsl:script element gebruikt, raden we u ten zeerste aan om het script, ongeacht de taal, in een CDATA-sectie te plaatsen. Omdat het script operatoren, id's of scheidingstekens voor een bepaalde taal kan bevatten als het niet in een CDATA-sectie staat, kan het mogelijk zijn dat het onjuist wordt geïnterpreteerd als XML. In de volgende XML ziet u een sjabloon van de CDATA-sectie waar code kan worden geplaatst.

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

Scriptfuncties

Functies kunnen worden gedeclareerd binnen het msxsl:script element. Wanneer een functie wordt gedeclareerd, bevindt deze zich in een scriptblok. Opmaakmodellen kunnen meerdere scriptblokken bevatten, die elk onafhankelijk van de andere werken. Dit betekent dat als u een scriptblok uitvoert, u een functie die u hebt gedefinieerd in een ander scriptblok niet kunt aanroepen, tenzij deze is gedeclareerd om dezelfde naamruimte en dezelfde scripttaal te hebben. Omdat elk scriptblok zich in een eigen taal kan bevindt en het blok wordt geparseerd volgens de grammaticaregels van die taalparser, raden we u aan de juiste syntaxis te gebruiken voor de taal die wordt gebruikt. Als u zich bijvoorbeeld in een Microsoft C#-scriptblok bevindt, gebruikt u de syntaxis van de C#-opmerking.

De opgegeven argumenten en retourwaarden voor de functie kunnen van elk type zijn. Omdat de W3C XPath-typen een subset zijn van de CLR-typen (Common Language Runtime), vindt typeconversie plaats op typen die niet worden beschouwd als een XPath-type. In de volgende tabel ziet u de bijbehorende W3C-typen en het equivalente CLR-type.

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

CLR-numerieke typen worden geconverteerd naar Double. Het DateTime type wordt geconverteerd naar String. IXPathNavigable typen worden geconverteerd naar XPathNavigator. XPathNavigator[] wordt geconverteerd naar XPathNodeIterator.

Alle andere typen veroorzaken een fout.

Naamruimten en assembly's importeren

De XslCompiledTransform klasse definieert een set assembly's en naamruimten die standaard door het msxsl:script element worden ondersteund. U kunt echter klassen en leden gebruiken die behoren tot een naamruimte die zich niet in de vooraf gedefinieerde lijst bevindt door de assembly en naamruimte in msxsl:script blok te importeren.

Assembly's

Er wordt standaard naar de volgende twee assembly's verwezen:

  • System.dll

  • System.Xml.dll

  • Microsoft.VisualBasic.dll (wanneer de scripttaal VB is)

U kunt de extra assembly's importeren met behulp van het msxsl:assembly element. Dit omvat de assembly wanneer het opmaakmodel wordt gecompileerd. Het msxsl:assembly element heeft de volgende definitie:

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

Het name kenmerk bevat de naam van de assembly en het href kenmerk bevat het pad naar de assembly. De assemblynaam kan een volledige naam zijn, zoals System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 of een korte naam, zoals System.Web.

Naamruimten

De volgende naamruimten zijn standaard opgenomen:

  • Systeem

  • System.Collection

  • System.Text

  • System.Text.RegularExpressions

  • System.Xml

  • System.Xml.Xsl

  • System.Xml.XPath

  • Microsoft.VisualBasic (wanneer de scripttaal VB is)

U kunt ondersteuning voor extra naamruimten toevoegen met behulp van het namespace kenmerk. De kenmerkwaarde is de naam van de naamruimte.

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

Opmerking

In het volgende voorbeeld wordt een ingesloten script gebruikt om de omtrek van een cirkel te berekenen op basis van de radius.

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>

Uitvoer

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

Zie ook