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>