Aracılığıyla paylaş


msxsl:script Kullanan Betik Blokları

Not

Betik blokları yalnızca .NET Framework'te desteklenir. .NET Core veya .NET 5 veya üzeri sürümlerde desteklenmez.

sınıfı, XslCompiledTransform öğesini kullanarak ekli betikleri msxsl:script destekler. Stil sayfası yüklendiğinde, tanımlı işlevler Kod Belgesi Nesne Modeli (CodeDOM) tarafından ortak ara dile (CIL) derlenir ve çalışma zamanında yürütülür. Katıştırılmış betik bloğundan oluşturulan derleme, stil sayfası için oluşturulan derlemeden ayrıdır.

XSLT Betiğini Etkinleştirme

Katıştırılmış betikler için destek, sınıfta isteğe bağlı bir XSLT ayarıdır XslCompiledTransform . Betik desteği varsayılan olarak devre dışıdır. Betik desteğini etkinleştirmek için özelliği olarak ayarlanmış true bir XsltSettings nesne EnableScript oluşturun ve nesnesini yöntemine Load geçirin.

Not

XSLT betik oluşturma yalnızca betik desteğine ihtiyacınız varsa ve tam olarak güvenilir bir ortamda çalışıyorsanız etkinleştirilmelidir.

msxsl:script Öğe Tanımı

msxsl:script öğesi, XSLT 1.0 önerisinin bir Microsoft uzantısıdır ve aşağıdaki tanıma sahiptir:

<msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script>

Ön msxsl ek ad alanı URI'sine urn:schemas-microsoft-com:xslt bağlıdır. Stil sayfası ad alanı bildirimini xmlns:msxsl=urn:schemas-microsoft-com:xslt içermelidir.

language özniteliği isteğe bağlıdır. Değeri, eklenmiş kod bloğunun kod dilidir. Dil, yöntemini kullanarak uygun CodeDOM derleyicisine CodeDomProvider.CreateProvider eşlenir. Sınıfı XslCompiledTransform , makinede uygun sağlayıcının yüklü olduğunu ve machine.config dosyasının system.codedom bölümüne kayıtlı olduğunu varsayarak herhangi bir Microsoft .NET dilini destekleyebilir. Bir language öznitelik belirtilmezse, dil varsayılan olarak JScript olur. Dil adı büyük/küçük harfe duyarlı olmadığından 'JavaScript' ve 'javascript' eşdeğerdir.

implements-prefix Özniteliği zorunludur. Bu öznitelik, ad alanını bildirmek ve betik bloğuyla ilişkilendirmek için kullanılır. Bu özniteliğin değeri, ad alanını temsil eden ön ektir. Bu ön ek, stil sayfasında herhangi bir yerde tanımlanabilir.

Not

öğesini kullanırken msxsl:script , dili ne olursa olsun betiğin bir CDATA bölümüne yerleştirilmesini kesinlikle öneririz. Betik belirli bir dil için işleçler, tanımlayıcılar veya sınırlayıcılar içerebileceğinden, bir CDATA bölümünde yer almazsa XML olarak yanlış yorumlanma olasılığı vardır. Aşağıdaki XML, kodun yerleştirilebileceği CDATA bölümünün şablonunu gösterir.

<msxsl:script implements-prefix='your-prefix' language='CSharp'>
<![CDATA[
// Code block.
]]>
</msxsl:script>

Betik İşlevleri

İşlevler öğesi içinde msxsl:script bildirilebilir. bir işlev bildirildiğinde, bir betik bloğunda yer alır. Stil sayfaları, her biri birbirinden bağımsız olarak çalışan birden çok betik bloğu içerebilir. Bu, bir betik bloğu içinde yürütürseniz, aynı ad alanına ve aynı betik diline sahip olduğu bildirilmediği sürece başka bir betik bloğunda tanımladığınız bir işlevi çağıramayacağınız anlamına gelir. Her betik bloğu kendi dilinde olabileceğinden ve blok bu dil ayrıştırıcısının dil bilgisi kurallarına göre ayrıştırıldığından, kullanılan dil için doğru söz dizimini kullanmanızı öneririz. Örneğin, bir Microsoft C# betik bloğundaysanız C# açıklama söz dizimini kullanın.

Sağlanan bağımsız değişkenler ve işleve döndürülen değerler herhangi bir türde olabilir. W3C XPath türleri ortak dil çalışma zamanı (CLR) türlerinin bir alt kümesi olduğundan, XPath türü olarak kabul edilmeyen türlerde tür dönüştürme gerçekleşir. Aşağıdaki tabloda ilgili W3C türleri ve eşdeğer CLR türü gösterilmektedir.

W3C türü CLR türü
String String
Boolean Boolean
Number Double
Result Tree Fragment XPathNavigator
Node Set XPathNodeIterator

CLR sayısal türleri olarak Doubledönüştürülür. Türü DateTime olarak Stringdönüştürülür. IXPathNavigable türleri olarak XPathNavigatordönüştürülür. XPathNavigator[] öğesine XPathNodeIteratordönüştürülür.

Diğer tüm türler hata oluşturur.

Ad Alanlarını ve Derlemeleri İçeri Aktarma

sınıfı, XslCompiledTransform öğesi tarafından msxsl:script varsayılan olarak desteklenen bir dizi derlemeyi ve ad alanını önceden belirler. Ancak, derlemeyi ve ad alanını blok halinde içeri aktararak önceden tanımlanmış listede olmayan bir ad msxsl:script alanına ait sınıfları ve üyeleri kullanabilirsiniz.

Bütünleştirilmiş Kodlar

Varsayılan olarak aşağıdaki iki derlemeye başvurulur:

  • System.dll

  • System.Xml.dll

  • Microsoft.VisualBasic.dll (betik dili VB olduğunda)

öğesini kullanarak msxsl:assembly ek derlemeleri içeri aktarabilirsiniz. Bu, stil sayfası derlendiğinde derlemeyi içerir. msxsl:assembly öğesi aşağıdaki tanıma sahiptir:

<msxsl:script>
  <msxsl:assembly name="system.assemblyName" />
  <msxsl:assembly href="path-name" />
    <![CDATA[
    // User code
    ]]>
</msxsl:script>

name özniteliği derlemenin adını, özniteliği ise href derlemenin yolunu içerir. Derleme adı"System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" gibi bir tam ad veya "System.Web" gibi kısa bir ad olabilir.

Ad alanları

Aşağıdaki ad alanları varsayılan olarak eklenir:

  • Sistem

  • System.Collection

  • System.Text

  • System.Text.RegularExpressions

  • System.Xml

  • System.Xml.Xsl

  • System.Xml.XPath

  • Microsoft.VisualBasic (betik dili VB olduğunda)

özniteliğini kullanarak namespace ek ad alanları için destek ekleyebilirsiniz. Öznitelik değeri ad alanının adıdır.

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

Örnek

Aşağıdaki örnekte, yarıçapı verilen dairenin çevresini hesaplamak için eklenmiş bir betik kullanılır.

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>

Çıktı

<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>

Ayrıca bkz.