Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
A szkriptblokkok csak a .NET-keretrendszerben 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 minden definiált függvényt lefordít a közös köztes nyelvre (CIL) a Code Document Object Model (CodeDOM) segítségével, és futásidőben 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 XslCompiledTransform osztály XSLT-beállításának egy opcionális lehetősége. 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 true értékre van állítva, majd adja át az objektumot a Load metódusnak.
Figyelmeztetés
A .NET 10-től kezdődően a EnableScript tulajdonság elavultként van megjelölve, és figyelmeztető SYSLIB0062 generál. Mivel a szkriptblokkok nem támogatottak a .NET Core-on vagy a .NET 5+-on, ennek a tulajdonságnak nincs hatása, és ha beállítja true, futásidőben PlatformNotSupportedException kivételt vált ki.
Megjegyzé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 elem meghatározása
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ő. A beágyazott kódblokk kódnyelve adja az értékét. 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ámogathat, 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.
Megjegyzés:
Amikor a msxsl:script elemet használjuk, erősen javasoljuk, hogy a szkript, függetlenül a nyelvtő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. Például, ha egy Microsoft C#-szkript blokkban 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 számtípusok konvertálódnak Double. A DateTime típust a rendszer átalakítja String. A(z) IXPathNavigable típusok XPathNavigator típusra lesznek konvertálva. 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. Azonban a msxsl:script blokkban az azzal egy névtérhez tartozó, de az előre definiált listán nem szereplő osztályokat és tagokat tudja használni, ha importálja az adott szerelvényt és névteret.
Gyűlések
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 az összeállítást 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 rövid név, például "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>
Kimenet
<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>