Bloky skriptu používající element msxsl:script
Poznámka:
Bloky skriptů jsou podporovány pouze v rozhraní .NET Framework. Nejsou podporovány v .NET Core nebo .NET 5 nebo novější.
Třída XslCompiledTransform podporuje vložené skripty pomocí elementu msxsl:script
. Při načtení šablony stylů se všechny definované funkce kompilují do společného zprostředkujícího jazyka (CIL) modelem objektu dokumentu kódu (CodeDOM) a spustí se během běhu. Sestavení vygenerované z bloku vloženého skriptu je oddělené od sestavení generovaného pro šablonu stylů.
Povolení skriptu XSLT
Podpora vložených skriptů je volitelné nastavení XSLT ve XslCompiledTransform třídě. Podpora skriptů je ve výchozím nastavení zakázaná. Chcete-li povolit podporu skriptu, vytvořte XsltSettings objekt s vlastností nastavenou EnableScript na true
a předejte objekt metodě Load .
Poznámka:
Skriptování XSLT by mělo být povolené jenom v případě, že potřebujete podporu skriptů a pracujete v plně důvěryhodném prostředí.
msxsl:script – definice elementu
Element msxsl:script
je rozšíření Microsoftu pro doporučení XSLT 1.0 a má následující definici:
<msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script>
Předpona msxsl
je vázána urn:schemas-microsoft-com:xslt
na identifikátor URI oboru názvů. Šablona stylů musí obsahovat xmlns:msxsl=urn:schemas-microsoft-com:xslt
deklaraci oboru názvů.
Atribut language
je nepovinný. Jeho hodnota je jazyk kódu vloženého bloku kódu. Jazyk je mapován na příslušný kompilátor CodeDOM pomocí CodeDomProvider.CreateProvider metody. Třída XslCompiledTransform může podporovat libovolný jazyk Microsoft .NET za předpokladu, že je na počítači nainstalován příslušný zprostředkovatel a je registrován v části system.codedom souboru machine.config. language
Pokud atribut není zadaný, jazyk se ve výchozím nastavení nastaví na JScript. V názvu jazyka se nerozlišují malá a velká písmena, takže javascript a javascript jsou ekvivalentní.
Atribut implements-prefix
je povinný. Tento atribut slouží k deklaraci oboru názvů a jeho přidružení k bloku skriptu. Hodnota tohoto atributu je předpona, která představuje obor názvů. Tuto předponu lze definovat někde v šabloně stylů.
Poznámka:
Při použití elementu msxsl:script
důrazně doporučujeme, aby se skript bez ohledu na jazyk umístil do oddílu CDATA. Protože skript může obsahovat operátory, identifikátory nebo oddělovače pro daný jazyk, pokud není obsažen v oddílu CDATA, může být chybně interpretován jako XML. Následující XML ukazuje šablonu oddílu CDATA, kde lze umístit kód.
<msxsl:script implements-prefix='your-prefix' language='CSharp'>
<![CDATA[
// Code block.
]]>
</msxsl:script>
Funkce skriptů
Funkce lze deklarovat v rámci elementu msxsl:script
. Když je funkce deklarována, je obsažena v bloku skriptu. Šablony stylů můžou obsahovat více bloků skriptů, z nichž každá funguje nezávisle na druhém. To znamená, že pokud spouštíte uvnitř bloku skriptu, nemůžete volat funkci, kterou jste definovali v jiném bloku skriptu, pokud není deklarována tak, aby měla stejný obor názvů a stejný skriptovací jazyk. Vzhledem k tomu, že každý blok skriptu může být ve vlastním jazyce a blok se parsuje podle gramatických pravidel daného analyzátoru jazyka, doporučujeme použít správnou syntaxi pro jazyk, který se používá. Pokud jste například v bloku skriptu Microsoft C#, použijte syntaxi komentáře jazyka C#.
Zadané argumenty a návratové hodnoty funkce mohou být libovolného typu. Vzhledem k tomu, že typy W3C XPath jsou podmnožinou typů modulu CLR (Common Language Runtime), převod typů se provádí u typů, které nejsou považovány za typ XPath. Následující tabulka uvádí odpovídající typy W3C a ekvivalentní typ CLR.
Typ W3C | Typ CLR |
---|---|
String |
String |
Boolean |
Boolean |
Number |
Double |
Result Tree Fragment |
XPathNavigator |
Node Set |
XPathNodeIterator |
Číselné typy CLR se převedou na Double. Typ DateTime je převeden na String. IXPathNavigable typy jsou převedeny na XPathNavigator. XPathNavigator[] je převeden na XPathNodeIterator.
Všechny ostatní typy vyvolá chybu.
Import oborů názvů a sestavení
Třída XslCompiledTransform předdefinuje sadu sestavení a oborů názvů, které jsou ve výchozím nastavení podporovány elementem msxsl:script
. Můžete však použít třídy a členy patřící do oboru názvů, který není v předdefinovaném seznamu importem sestavení a oboru názvů v msxsl:script
bloku.
Sestavení
Ve výchozím nastavení jsou odkazována na následující dvě sestavení:
System.dll
System.Xml.dll
Microsoft.VisualBasic.dll (pokud je jazyk skriptu VB)
Další sestavení můžete importovat pomocí elementu msxsl:assembly
. To zahrnuje sestavení při kompilaci šablony stylů. Element msxsl:assembly
má následující definici:
<msxsl:script>
<msxsl:assembly name="system.assemblyName" />
<msxsl:assembly href="path-name" />
<![CDATA[
// User code
]]>
</msxsl:script>
Atribut name
obsahuje název sestavení a href
atribut obsahuje cestu k sestavení. Název sestavení může být úplný název, například System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 nebo krátký název, například System.Web.
Obory názvů
Ve výchozím nastavení jsou zahrnuty následující obory názvů:
Systémový
System.Collection
System.Text
System.Text.RegularExpressions
System.Xml
System.xml.xsl
System.Xml.XPath
Microsoft.VisualBasic (pokud je jazyk skriptu VB)
Pomocí atributu namespace
můžete přidat podporu dalších oborů názvů. Hodnota atributu je název oboru názvů.
<msxsl:script>
<msxsl:using namespace="system.namespaceName" />
<![CDATA[
// User code
]]>
</msxsl:script>
Příklad
Následující příklad používá vložený skript k výpočtu obvodu kruhu vzhledem k jeho poloměru.
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>
Výstup
<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>