Condividi tramite


Blocchi di script con msxsl:script

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>

Vedere anche