Szkriptblokkok msxsl:script használatával
Feljegyzés
A szkriptblokkok csak .NET-keretrendszer támogatottak. A .NET Core vagy a .NET 5 vagy újabb verziók nem támogatják őket.
Az XslCompiledTransform osztály támogatja a beágyazott szkripteket az msxsl:script
elem használatával. A stíluslap betöltésekor a program a definiált függvényeket a Code Document Object Model (CodeDOM) által közös köztes nyelvre (CIL) fordítja le, és futtatás közben hajtja végre. A beágyazott szkriptblokkból létrehozott szerelvény külön van, mint a stíluslaphoz létrehozott szerelvény.
XSLT-szkript engedélyezése
A beágyazott szkriptek támogatása az osztály opcionális XSLT-beállítása XslCompiledTransform . A szkriptek támogatása alapértelmezés szerint le van tiltva. A szkript támogatásának engedélyezéséhez hozzon létre egy XsltSettings objektumot, amelynek a EnableScript tulajdonsága a metódushoz true
van állítva, és adja át az objektumot.Load
Feljegyzés
Az XSLT-szkriptek csak akkor engedélyezhetők, ha szkripttámogatást igényel, és teljes mértékben megbízható környezetben dolgozik.
msxsl:script Elemdefiníció
Az msxsl:script
elem egy Microsoft-bővítmény az XSLT 1.0-s javaslathoz, és a következő definícióval rendelkezik:
<msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script>
Az msxsl
előtag az urn:schemas-microsoft-com:xslt
URI névtérhez van kötve. A stíluslapnak tartalmaznia kell a névtér deklarációját xmlns:msxsl=urn:schemas-microsoft-com:xslt
.
Az language
attribútum nem kötelező. Értéke a beágyazott kódblokk kódnyelve. A nyelv a megfelelő CodeDOM-fordítóhoz van leképezve a CodeDomProvider.CreateProvider metódus használatával. Az XslCompiledTransform osztály bármilyen Microsoft .NET-nyelvet támogat, feltéve, hogy a megfelelő szolgáltató telepítve van a gépen, és regisztrálva van a machine.config fájl system.codedom szakaszában. Ha nincs language
megadva attribútum, a nyelv alapértelmezés szerint JScript lesz. A nyelv neve nem megkülönbözteti a kis- és nagybetűket, ezért a "JavaScript" és a "javascript" egyenértékű.
Az implements-prefix
attribútum kötelező. Ez az attribútum egy névtér deklarálásához és a szkriptblokkhoz való társításához használható. Ennek az attribútumnak az értéke a névteret jelképező előtag. Ez az előtag definiálható valahol egy stíluslapon.
Feljegyzés
Az elem használatakor msxsl:script
erősen javasoljuk, hogy a szkript nyelvtől függetlenül egy CDATA-szakaszban legyen elhelyezve. Mivel a szkript tartalmazhat operátorokat, azonosítókat vagy elválasztójeleket egy adott nyelvhez, ha nem szerepel egy CDATA-szakaszban, akkor xml-ként való félreértelmezhető. Az alábbi XML a CDATA szakasz egy sablonját jeleníti meg, ahol a kód elhelyezhető.
<msxsl:script implements-prefix='your-prefix' language='CSharp'>
<![CDATA[
// Code block.
]]>
</msxsl:script>
Szkriptfüggvények
A függvények deklarálhatók az elemen msxsl:script
belül. Ha egy függvény deklarálva van, az egy szkriptblokkban található. A stíluslapok több szkriptblokkot tartalmazhatnak, amelyek mindegyike független a másiktól. Ez azt jelenti, hogy ha szkriptblokkon belül hajt végre, akkor nem hívhat meg egy másik szkriptblokkban definiált függvényt, kivéve, ha a rendszer ugyanazt a névteret és ugyanazt a szkriptnyelvet deklarálja. Mivel minden szkriptblokk a saját nyelvén is lehet, és a blokk az adott nyelvelemző nyelvhelyességi szabályainak megfelelően van elemezve, javasoljuk, hogy a használt nyelv megfelelő szintaxisát használja. Ha például Microsoft C#-szkriptblokkban van, használja a C# megjegyzésszintaxisát.
A megadott argumentumok és a függvénynek visszaadott értékek bármilyen típusúak lehetnek. Mivel a W3C XPath-típusok a közös nyelvi futtatókörnyezet (CLR) típusok részhalmazai, a típusátalakítás olyan típusok esetében történik, amelyek nem tekinthetők XPath-típusnak. Az alábbi táblázat a megfelelő W3C-típusokat és az azzal egyenértékű CLR-típust mutatja be.
W3C-típus | CLR-típus |
---|---|
String |
String |
Boolean |
Boolean |
Number |
Double |
Result Tree Fragment |
XPathNavigator |
Node Set |
XPathNodeIterator |
A CLR-numerikus típusok konvertálva lesznek Double. A DateTime típust a rendszer átalakítja String. IXPathNavigable típusok lesznek konvertálva XPathNavigator. Az XPathNavigator[] átalakítva .XPathNodeIterator
Minden más típus hibát jelez.
Névterek és szerelvények importálása
Az XslCompiledTransform osztály előre definiálja az elem által msxsl:script
alapértelmezés szerint támogatott szerelvényeket és névtereket. Az előre definiált listán nem szereplő névtérhez tartozó osztályokat és tagokat azonban használhatja a blokk szerelvényének és névterének msxsl:script
importálásával.
Szerelvények
A rendszer alapértelmezés szerint a következő két szerelvényre hivatkozik:
System.dll
System.Xml.dll
Microsoft.VisualBasic.dll (ha a szkript nyelve VB)
Az elem használatával msxsl:assembly
importálhatja a további szerelvényeket. Ez magában foglalja a szerelvényt a stíluslap fordításakor. Az msxsl:assembly
elem definíciója a következő:
<msxsl:script>
<msxsl:assembly name="system.assemblyName" />
<msxsl:assembly href="path-name" />
<![CDATA[
// User code
]]>
</msxsl:script>
Az name
attribútum tartalmazza a szerelvény nevét, az href
attribútum pedig a szerelvény elérési útját. A szerelvény neve lehet teljes név, például "System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" vagy egy rövid név, például a "System.Web".
Névterek
Alapértelmezés szerint a következő névterek szerepelnek:
Rendszer
System.Collection
System.Text
System.Text.RegularExpressions
System.Xml
System.Xml.Xsl
System.Xml.XPath
Microsoft.VisualBasic (ha a szkript nyelve VB)
Az attribútum használatával namespace
további névterekhez is hozzáadhat támogatást. Az attribútum értéke a névtér neve.
<msxsl:script>
<msxsl:using namespace="system.namespaceName" />
<![CDATA[
// User code
]]>
</msxsl:script>
Példa
Az alábbi példa beágyazott szkripttel számítja ki egy kör kerületét a sugara alapján.
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>
Hozam
<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>