Bagikan melalui


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>

Lihat juga