Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Betik blokları yalnızca .NET Framework'te desteklenir. .NET Core veya .NET 5 veya üzeri sürümlerde desteklenmez .
XslCompiledTransform sınıfı, msxsl:script öğesini kullanarak ekli betikleri 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ı sırası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
Destek gömülü betikler için isteğe bağlı bir XSLT ayarıdır XslCompiledTransform sınıfında. Betik desteği varsayılan olarak devre dışıdır. Betik desteğini etkinleştirmek için, XsltSettings özelliği olarak ayarlanmış bir EnableScript nesnesi oluşturun ve bu nesneyi true yöntemine geçirin.
Uyarı
.NET 10'dan başlayarak özelliği EnableScript eski olarak işaretlenir ve SYSLIB0062 uyarı oluşturur. .NET Core veya .NET 5+ üzerinde betik blokları desteklenmediğinden, bu özelliğin bir etkisi yoktur ve ayarlandığında çalışma zamanında bir PlatformNotSupportedException fırlatır.
Uyarı
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 öğesi 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>
msxsl öneki urn:schemas-microsoft-com:xslt ad alan URI'sine 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, CodeDomProvider.CreateProvider yöntemini kullanarak uygun CodeDOM derleyicisine 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 kaydedilmiş 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, bir ad alanı bildirmek ve betik bloğuna bağlamak 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.
Uyarı
öğe kullanılırken msxsl:script dili ne olursa olsun betiğin bir CDATA bölümüne yerleştirilmesini şiddetle tavsiye ederiz. Betik belirli bir dil için işleçler, tanımlayıcılar veya sınırlayıcılar içerebileceği için bir CDATA bölümünde yer almadığında 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 iş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 Double olarak dönüştürülür. DateTime türü String olarak dönüştürülür. IXPathNavigable türleri XPathNavigator türlerine dönüştürülür. XPathNavigator[] öğesine XPathNodeIteratordönüştürülür.
Diğer tüm türler hata atar.
Ad alanlarını ve derlemeleri içeri aktarma
XslCompiledTransform sınıfı, msxsl:script öğesi tarafından varsayılan olarak desteklenen bir dizi derleme ve ad alanını önceden tanımlar. Ancak, derlemeyi ve ad alanını msxsl:script bloğu içinde içeri aktararak önceden tanımlanmış listede olmayan bir ad alanına ait sınıfları ve üyeleri kullanabilirsiniz.
Bileşenler
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 bütünleştirme işlemi 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.
Namespace'ler
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 bir dairenin çevresini hesaplamak için gömülü bir komut dosyası 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>