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>