Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
I blocchi di script sono supportati solo in .NET Framework. Non sono supportati in .NET Core o .NET 5 o versioni successive.
La XslCompiledTransform classe supporta script incorporati usando l'elemento msxsl:script . Quando il foglio di stile viene caricato, tutte le funzioni definite vengono compilate in Common Intermediate Language (CIL) dal Code Document Object Model (CodeDOM) e vengono eseguite durante il runtime. L'assembly generato dal blocco di script incorporato è separato dall'assembly generato per il foglio di stile.
Abilitare lo script XSLT
Il supporto per gli script incorporati è un'impostazione XSLT facoltativa nella XslCompiledTransform classe . Il supporto dello script è disabilitato per impostazione predefinita. Per abilitare il supporto dello script, creare un XsltSettings oggetto con la EnableScript proprietà impostata su true e passare l'oggetto al Load metodo .
Avvertimento
A partire da .NET 10, la EnableScript proprietà viene contrassegnata come obsoleta e genera un avviso SYSLIB0062. Poiché i blocchi di script non sono supportati in .NET Core o .NET 5+, questa proprietà non ha alcun effetto e impostarla su true genera un'eccezione PlatformNotSupportedException in fase di esecuzione.
Annotazioni
Gli script XSLT devono essere abilitati solo se è necessario il supporto dello script e si lavora in un ambiente completamente attendibile.
definizione dell'elemento msxsl:script
L'elemento msxsl:script è un'estensione Microsoft per la raccomandazione XSLT 1.0 e ha la definizione seguente:
<msxsl:script language = "language-name" implements-prefix = "prefix of user namespace"> </msxsl:script>
Il prefisso msxsl è associato allo spazio dei nomi URI urn:schemas-microsoft-com:xslt. Il foglio di stile deve includere la dichiarazione del namespace xmlns:msxsl=urn:schemas-microsoft-com:xslt.
L'attributo language è facoltativo. Il valore è il linguaggio di codice del blocco di codice incorporato. Il linguaggio viene mappato al compilatore CodeDOM appropriato usando il CodeDomProvider.CreateProvider metodo . La XslCompiledTransform classe può supportare qualsiasi linguaggio Microsoft .NET, presupponendo che il provider appropriato sia installato nel computer e sia registrato nella sezione system.codedom del file machine.config. Se non viene specificato un language attributo, per impostazione predefinita il linguaggio è JScript. Il nome del linguaggio non fa distinzione tra maiuscole e minuscole, quindi 'JavaScript' e 'javascript' sono equivalenti.
L'attributo implements-prefix è obbligatorio. Questo attributo viene usato per dichiarare uno spazio dei nomi e associarlo al blocco di script. Il valore di questo attributo è il prefisso che rappresenta lo spazio dei nomi. Questo prefisso può essere definito in un punto qualsiasi di un foglio di stile.
Annotazioni
Quando si usa l'elemento msxsl:script , è consigliabile inserire lo script, indipendentemente dal linguaggio, all'interno di una sezione CDATA. Poiché lo script può contenere operatori, identificatori o delimitatori per un determinato linguaggio, se non è contenuto in una sezione CDATA, può essere interpretato erroneamente come XML. Il codice XML seguente illustra un modello della sezione CDATA in cui è possibile inserire il codice.
<msxsl:script implements-prefix='your-prefix' language='CSharp'>
<![CDATA[
// Code block.
]]>
</msxsl:script>
Funzioni script
Le funzioni possono essere dichiarate all'interno dell'elemento msxsl:script . Quando una funzione viene dichiarata, è contenuta in un blocco di script. I fogli di stile possono contenere più blocchi di script, ognuno indipendentemente dall'altro. Ciò significa che se si esegue all'interno di un blocco di script, non è possibile chiamare una funzione definita in un altro blocco di script, a meno che non venga dichiarata per avere lo stesso spazio dei nomi e lo stesso linguaggio di scripting. Poiché ogni blocco di script può trovarsi nel proprio linguaggio e il blocco viene analizzato in base alle regole grammaticali del parser del linguaggio, è consigliabile usare la sintassi corretta per il linguaggio in uso. Ad esempio, se ci si trova in un blocco di script Microsoft C#, usare la sintassi dei commenti C#.
Gli argomenti forniti e i valori restituiti alla funzione possono essere di qualsiasi tipo. Poiché i tipi XPath W3C sono un subset dei tipi CLR (Common Language Runtime), la conversione dei tipi avviene su tipi che non sono considerati un tipo XPath. La tabella seguente illustra i tipi W3C corrispondenti e il tipo CLR equivalente.
| Tipo W3C | Tipo CLR |
|---|---|
String |
String |
Boolean |
Boolean |
Number |
Double |
Result Tree Fragment |
XPathNavigator |
Node Set |
XPathNodeIterator |
I tipi numerici CLR vengono convertiti in Double. Il DateTime tipo viene convertito in String. IXPathNavigable i tipi vengono convertiti in XPathNavigator. XPathNavigator[] viene convertito in XPathNodeIterator.
Tutti gli altri tipi generano un errore.
Importare spazi dei nomi e assembly
La classe XslCompiledTransform predefinisce un set di assembly e spazi dei nomi supportati di default dall'elemento msxsl:script. Tuttavia, puoi usare classi e membri appartenenti a uno spazio dei nomi che non si trova nell'elenco predefinito importandoli nel blocco msxsl:script insieme all'assembly e allo spazio dei nomi.
Assemblaggi
Per impostazione predefinita, si fa riferimento ai due assembly seguenti:
- System.dll
- System.Xml.dll
- Microsoft.VisualBasic.dll (quando il linguaggio di script è VB)
È possibile importare gli assembly aggiuntivi usando l'elemento msxsl:assembly . Include l'assembly quando viene compilato il foglio di stile. L'elemento msxsl:assembly ha la definizione seguente:
<msxsl:script>
<msxsl:assembly name="system.assemblyName" />
<msxsl:assembly href="path-name" />
<![CDATA[
// User code
]]>
</msxsl:script>
L'attributo name contiene il nome dell'assembly e l'attributo href contiene il percorso dell'assembly. Il nome dell'assembly può essere un nome completo, ad esempio "System.Data, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" o un nome breve, ad esempio "System.Web".
Namespace
Per impostazione predefinita, i seguenti namespace sono inclusi:
- Sistema
- System.Collection
- System.Text
- System.Text.RegularExpressions
- System.Xml
- System.Xml.Xsl
- System.Xml.XPath
- Microsoft.VisualBasic (quando il linguaggio di script è VB)
È possibile aggiungere il supporto per altri spazi dei nomi usando l'attributo namespace . Il valore dell'attributo è il nome dello spazio dei nomi.
<msxsl:script>
<msxsl:using namespace="system.namespaceName" />
<![CDATA[
// User code
]]>
</msxsl:script>
Esempio
Nell'esempio seguente viene usato uno script incorporato per calcolare la circonferenza di un cerchio in base al relativo raggio.
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>
Risultato
<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>