Skriptblock med hjälp av msxsl:script

Kommentar

Skriptblock stöds endast i .NET Framework. De stöds inte på .NET Core eller .NET 5 eller senare.

Klassen XslCompiledTransform stöder inbäddade skript med elementet msxsl:script . När formatmallen läses in kompileras alla definierade funktioner till det gemensamma mellanliggande språket (CIL) av Code Document Object Model (CodeDOM) och körs under körningen. Sammansättningen som genereras från det inbäddade skriptblocket är separat än den sammansättning som genererats för formatmallen.

Aktivera XSLT-skript

Stöd för inbäddade skript är en valfri XSLT-inställning för XslCompiledTransform klassen. Skriptstöd är inaktiverat som standard. Om du vill aktivera skriptstöd skapar du ett XsltSettings objekt med egenskapen EnableScript inställd true på och skickar objektet till Load -metoden.

Kommentar

XSLT-skript ska endast aktiveras om du behöver skriptstöd och arbetar i en fullständigt betrodd miljö.

msxsl:script Element Definition

Elementet msxsl:script är ett Microsoft-tillägg till XSLT 1.0-rekommendationen och har följande definition:

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

Prefixet msxsl är bundet till namnområdets urn:schemas-microsoft-com:xslt URI. Formatmallen måste innehålla namnområdesdeklarationen xmlns:msxsl=urn:schemas-microsoft-com:xslt .

Attributet language är valfritt. Dess värde är kodspråket för det inbäddade kodblocket. Språket mappas till lämplig CodeDOM-kompilator med hjälp av CodeDomProvider.CreateProvider metoden . Klassen XslCompiledTransform kan stödja alla Microsoft .NET-språk, förutsatt att lämplig provider är installerad på datorn och är registrerad i avsnittet system.codedom i filen machine.config. Om ett language attribut inte har angetts är språket JScript som standard. Språknamnet är inte skiftlägeskänsligt så "JavaScript" och "javascript" är likvärdiga.

Attributet implements-prefix är obligatoriskt. Det här attributet används för att deklarera ett namnområde och associera det med skriptblocket. Värdet för det här attributet är prefixet som representerar namnområdet. Det här prefixet kan definieras någonstans i en formatmall.

Kommentar

När du använder elementet msxsl:script rekommenderar vi starkt att skriptet, oavsett språk, placeras i ett CDATA-avsnitt. Eftersom skriptet kan innehålla operatorer, identifierare eller avgränsare för ett visst språk, om det inte finns i ett CDATA-avsnitt, kan det misstolkas som XML. Följande XML visar en mall i avsnittet CDATA där kod kan placeras.

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

Skriptfunktioner

Funktioner kan deklareras i elementet msxsl:script . När en funktion deklareras finns den i ett skriptblock. Formatmallar kan innehålla flera skriptblock, var och en fungerar oberoende av den andra. Det innebär att om du kör i ett skriptblock kan du inte anropa en funktion som du har definierat i ett annat skriptblock om den inte deklareras ha samma namnområde och samma skriptspråk. Eftersom varje skriptblock kan vara på sitt eget språk och blocket parsas enligt grammatikreglerna för språkparsern rekommenderar vi att du använder rätt syntax för det språk som används. Om du till exempel är i ett Microsoft C#-skriptblock använder du C#-kommentarssyntaxen.

De angivna argumenten och returvärdena till funktionen kan vara av vilken typ som helst. Eftersom W3C XPath-typerna är en delmängd av CLR-typerna (Common Language Runtime) sker typkonvertering på typer som inte anses vara en XPath-typ. I följande tabell visas motsvarande W3C-typer och motsvarande CLR-typ.

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

NUMERISKA CLR-typer konverteras till Double. Typen DateTime konverteras till String. IXPathNavigable -typer konverteras till XPathNavigator. XPathNavigator[] konverteras till XPathNodeIterator.

Alla andra typer utlöser ett fel.

Importera namnområden och sammansättningar

Klassen XslCompiledTransform fördefinierade en uppsättning sammansättningar och namnområden som stöds som standard av elementet msxsl:script . Du kan dock använda klasser och medlemmar som tillhör ett namnområde som inte finns med i den fördefinierade listan genom att importera sammansättnings- och namnområdet i msxsl:script blocket.

Sammansättningar

Följande två sammansättningar refereras som standard:

  • System.dll

  • System.Xml.dll

  • Microsoft.VisualBasic.dll (när skriptspråket är VB)

Du kan importera de ytterligare sammansättningarna med hjälp av -elementet msxsl:assembly . Detta inkluderar sammansättningen när formatmallen kompileras. Elementet msxsl:assembly har följande definition:

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

Attributet name innehåller namnet på sammansättningen och href attributet innehåller sökvägen till sammansättningen. Sammansättningsnamnet kan vara ett fullständigt namn, till exempel "System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" eller ett kort namn, till exempel "System.Web".

Namnrymder

Följande namnområden ingår som standard:

  • System

  • System.Collection

  • System.Text

  • System.Text.RegularExpressions

  • System.xml

  • System.Xml.Xsl

  • System.Xml.XPath

  • Microsoft.VisualBasic (när skriptspråket är VB)

Du kan lägga till stöd för ytterligare namnområden med hjälp av attributet namespace . Attributvärdet är namnet på namnområdet.

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

Exempel

I följande exempel används ett inbäddat skript för att beräkna omkretsen för en cirkel med tanke på dess radie.

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>

Output

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

Se även