Blok Skrip Menggunakan msxsl:script
Catatan
Blok skrip hanya didukung dalam .NET Framework. Blok skrip tidak didukung di .NET Core atau .NET 5 atau yang lebih baru.
Kelas XslCompiledTransform mendukung skrip yang disematkan menggunakan msxsl:script
elemen. Saat lembar gaya dimuat, fungsi yang ditentukan dikompilasi ke bahasa perantara umum (CIL) oleh Model Objek Dokumen Kode (CodeDOM) dan dijalankan selama run time. Rakitan yang dihasilkan dari blok skrip yang disematkan terpisah dari rakitan yang dihasilkan untuk lembar gaya.
Mengaktifkan Skrip XSLT
Dukungan untuk skrip yang disematkan adalah pengaturan XSLT opsional pada XslCompiledTransform kelas. Dukungan skrip dinonaktifkan secara default. Untuk mengaktifkan dukungan skrip, buat XsltSettings objek dengan properti yang EnableScript diatur ke true
dan teruskan objek ke Load metode.
Catatan
Skrip XSLT harus diaktifkan hanya jika Anda memerlukan dukungan skrip dan Anda bekerja di lingkungan yang sepenuhnya tepercaya.
msxsl:script Element Definition
Elemen msxsl:script
ini adalah ekstensi Microsoft untuk rekomendasi XSLT 1.0 dan memiliki definisi berikut:
<msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script>
msxsl
Awalan terikat ke urn:schemas-microsoft-com:xslt
URI namespace layanan. Lembar gaya harus menyertakan xmlns:msxsl=urn:schemas-microsoft-com:xslt
deklarasi namespace layanan.
Atribut language
bersifat opsional. Nilainya adalah bahasa kode dari blok kode yang disematkan. Bahasa dipetakan ke pengompilasi CodeDOM yang sesuai menggunakan CodeDomProvider.CreateProvider metode. Kelas XslCompiledTransform dapat mendukung bahasa Microsoft .NET apa pun, dengan asumsi penyedia yang sesuai diinstal pada komputer dan terdaftar di bagian system.codedom dari file machine.config. Jika language
atribut tidak ditentukan, bahasa pemrogram default ke Jscript. Nama bahasa pemrogram tidak peka huruf besar/kecil sehingga 'JavaScript' dan 'javascript' setara.
Atribut implements-prefix
bersifat wajib. Atribut ini digunakan untuk mendeklarasikan namespace layanan dan mengaitkannya dengan blok skrip. Nilai atribut ini adalah awalan yang mewakili namespace layanan. Awalan ini dapat ditentukan di suatu tempat dalam lembar gaya.
Catatan
Saat menggunakan msxsl:script
elemen, kami sangat menyarankan agar skrip, terlepas dari bahasa pemrogram, ditempatkan di dalam bagian CDATA. Karena skrip dapat berisi operator, pengidentifikasi, atau pemisah untuk bahasa pemrogram tertentu, jika tidak terkandung dalam bagian CDATA, skrip memiliki potensi disalahartikan sebagai XML. XML berikut ini memperlihatkan templat bagian CDATA tempat kode dapat ditempatkan.
<msxsl:script implements-prefix='your-prefix' language='CSharp'>
<![CDATA[
// Code block.
]]>
</msxsl:script>
Fungsi Skrip
Fungsi dapat dideklarasikan dalam msxsl:script
elemen. Ketika fungsi dideklarasikan, fungsi tersebut terkandung dalam blok skrip. Lembar gaya dapat berisi beberapa blok skrip, masing-masing beroperasi independen dari yang lain. Itu berarti bahwa jika Anda menjalankan di dalam blok skrip, Anda tidak dapat memanggil fungsi yang Anda tentukan di blok skrip lain kecuali dinyatakan memiliki namespace layanan yang sama dan bahasa pemrogram skrip yang sama. Karena setiap blok skrip dapat berada dalam bahasa pemrogramnya sendiri, dan blok diurai sesuai dengan aturan tata bahasa parser bahasa pemrogram tersebut, kami menyarankan Anda menggunakan sintaks yang benar untuk bahasa pemrogram yang digunakan. Misalnya, jika Anda berada di blok skrip Microsoft C#, gunakan sintaks komentar C#.
Argumen yang disediakan dan mengembalikan nilai ke fungsi bisa dari jenis apa pun. Karena jenis W3C XPath adalah subset dari jenis runtime bahasa umum (CLR), konversi jenis terjadi pada jenis yang tidak dianggap sebagai jenis JalurX. Tabel berikut ini memperlihatkan jenis W3C yang sesuai dan jenis CLR yang setara.
Jenis W3C | jenis CLR |
---|---|
String |
String |
Boolean |
Boolean |
Number |
Double |
Result Tree Fragment |
XPathNavigator |
Node Set |
XPathNodeIterator |
Jenis numerik CLR dikonversi menjadi Double. DateTime Jenis dikonversi menjadi String. IXPathNavigable jenis dikonversi menjadi XPathNavigator. XPathNavigator[] dikonversi menjadi XPathNodeIterator.
Semua jenis lainnya melemparkan kesalahan.
Mengimpor Namespace layanan dan Rakitan
Kelas XslCompiledTransform menentukan sekumpulan rakitan dan namespace layanan yang didukung secara default oleh msxsl:script
elemen. Namun, Anda dapat menggunakan kelas dan anggota milik namespace layanan yang tidak ada dalam daftar yang telah ditentukan sebelumnya dengan mengimpor rakitan dan namespace layanan dalam msxsl:script
blok.
Rakitan
Dua rakitan berikut dirujuk secara default:
System.dll
System.Xml.dll
Microsoft.VisualBasic.dll (ketika bahasa skrip adalah VB)
Anda dapat mengimpor rakitan tambahan menggunakan msxsl:assembly
elemen. Ini mencakup perakitan saat lembar gaya dikompilasi. Elemen ini msxsl:assembly
memiliki definisi berikut:
<msxsl:script>
<msxsl:assembly name="system.assemblyName" />
<msxsl:assembly href="path-name" />
<![CDATA[
// User code
]]>
</msxsl:script>
Atribut name
berisi nama perakitan dan href
atribut berisi jalur ke perakitan. Nama rakitan dapat berupa nama lengkap, seperti "System.Data, Version=2.0.3600.0, Culture=netral, PublicKeyToken=b77a5c561934e089", atau nama pendek, seperti "System.Web".
Namaspace
Namespace layanan berikut disertakan secara default:
Sistem
System.Collection
System.Text
System.Text.RegularExpressions
System.Xml
System.Xml.Xsl
System.Xml.XPath
Microsoft.VisualBasic.dll (ketika bahasa skrip adalah VB)
Anda dapat menambahkan dukungan untuk namespace layanan tambahan menggunakan namespace
atribut. Nilai atribut adalah nama namespace layanan.
<msxsl:script>
<msxsl:using namespace="system.namespaceName" />
<![CDATA[
// User code
]]>
</msxsl:script>
Contoh
Contoh berikut menggunakan skrip yang disematkan untuk menghitung lingkar lingkaran mengingat radiusnya.
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>