Bagikan melalui


Blok skrip Menggunakan msxsl:script

Nota

Blok skrip hanya didukung di .NET Framework. Mereka tidak didukung pada .NET Core atau .NET 5 atau versi 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 runtime. Rakitan yang dihasilkan dari blok skrip yang disematkan terpisah dari rakitan yang dihasilkan untuk lembar gaya.

Aktifkan skrip XSLT

Dukungan untuk skrip yang disematkan adalah pengaturan XSLT opsional pada XslCompiledTransform kelas . Dukungan skrip dinonaktifkan secara default. Untuk mengaktifkan dukungan skrip, buat objek XsltSettings dengan properti EnableScript diatur ke true dan serahkan objek ke metode Load.

Peringatan

Mulai dari .NET 10, EnableScript properti ditandai sebagai usang dan menghasilkan SYSLIB0062 peringatan. Karena blok skrip tidak didukung pada .NET Core atau .NET 5+, properti ini tidak berpengaruh dan mengaturnya untuk true melemparkan PlatformNotSupportedException pada waktu proses.

Nota

Pembuatan skrip XSLT harus diaktifkan hanya jika Anda memerlukan dukungan skrip dan Anda bekerja di lingkungan yang sepenuhnya tepercaya.

definisi elemen msxsl:script

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>

Awalan msxsl terikat ke URI namespace urn:schemas-microsoft-com:xslt. Lembar gaya harus menyertakan deklarasi namespace xmlns:msxsl=urn:schemas-microsoft-com:xslt.

Atribut language bersifat opsional. Nilainya adalah bahasa kode dari blok kode yang disematkan. Bahasa ini dipetakan ke pengompilasi CodeDOM yang sesuai menggunakan metode .CodeDomProvider.CreateProvider 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 atribut language tidak ditentukan, bahasa akan menjadi JScript secara default. Nama bahasa tidak peka terhadap huruf besar atau kecil sehingga 'JavaScript' dan 'javascript' setara.

Atribut implements-prefix ini wajib. Atribut ini digunakan untuk mendeklarasikan namespace layanan dan mengaitkannya dengan blok skrip. Nilai atribut ini adalah awalan yang mewakili namespace. Awalan ini dapat didefinisikan di suatu tempat dalam stylesheet.

Nota

Saat menggunakan msxsl:script elemen , kami sangat menyarankan agar skrip, terlepas dari bahasa, ditempatkan di dalam bagian CDATA. Karena skrip dapat berisi operator, pengidentifikasi, atau pemisah untuk bahasa tertentu, jika tidak terkandung dalam bagian CDATA, skrip memiliki potensi disalahartikan sebagai XML. XML berikut menunjukkan 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 yang sama dan bahasa pembuatan skrip yang sama. Karena setiap blok skrip dapat dalam bahasanya sendiri, dan blok diurai sesuai dengan aturan tata bahasa pengurai bahasa tersebut, kami sarankan Anda menggunakan sintaks yang benar untuk bahasa 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 XPath. Tabel berikut menunjukkan 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 ke Double. Jenis DateTime dikonversi ke String. IXPathNavigable jenis dikonversi ke XPathNavigator. XPathNavigator[] dikonversi ke XPathNodeIterator.

Semua jenis lainnya menghasilkan kesalahan.

Mengimpor namespace dan rakitan

Kelas XslCompiledTransform telah menentukan serangkaian rakitan dan namespace yang didukung secara default oleh msxsl:script elemen . Namun, Anda dapat menggunakan kelas dan anggota milik namespace yang tidak ada dalam daftar yang telah ditentukan sebelumnya dengan mengimpor assembly dan namespace dalam blok msxsl:script.

Perakitan

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 termasuk penyusunan saat lembar gaya dikompilasi. Elemen 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 assembly dan href atribut berisi jalur ke assembly. Nama rakitan dapat berupa nama lengkap, seperti "System.Data, Version=2.0.3600.0, Culture=netral, PublicKeyToken=b77a5c561934e089", atau nama pendek, seperti "System.Web".

Namespace

Namespace berikut disertakan secara default:

  • Sistem
  • System.Collection
  • System.Text
  • System.Text.RegularExpressions
  • System.Xml
  • System.Xml.Xsl
  • System.Xml.XPath
  • Microsoft.VisualBasic (saat bahasa skrip adalah VB)

Anda dapat menambahkan dukungan untuk namespace tambahan menggunakan namespace atribut . Nilai atribut adalah nama namespace.

<msxsl:script>
  <msxsl:using namespace="system.namespaceName" />
    <![CDATA[
    // User code
    ]]>
</msxsl:script>

Contoh

Contoh berikut menggunakan skrip yang disematkan untuk menghitung keliling lingkaran diberikan 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>

Keluaran

<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