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>