Scripting dei fogli di stile XSLT con <msxsl:script>XSLT Stylesheet Scripting Using <msxsl:script>

La classe XslTransform supporta lo scripting incorporato mediante l'elemento script.The XslTransform class supports embedded scripting using the script element.

Nota

La classe XslTransform è obsoleta in .NET Framework 2.0.NET Framework 2.0.The XslTransform class is obsolete in the .NET Framework 2.0.NET Framework 2.0. È possibile eseguire le trasformazioni XSLT (Extensible Stylesheet Language for Transformations) usando la classe XslCompiledTransform.You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the XslCompiledTransform class. Per altre informazioni, vedere Utilizzo della classe XslCompiledTransform e Migrazione dalla classe XslTransform.See Using the XslCompiledTransform Class and Migrating From the XslTransform Class for more information.

La classe XslTransform supporta lo scripting incorporato mediante l'elemento script.The XslTransform class supports embedded scripting using the script element. Dal momento che, quando viene caricato il foglio di stile, le funzioni definite vengono compilate nel linguaggio MSIL (Microsoft Intermediate Language) mediante l'incapsulamento in una definizione della classe, non si verifica alcuna riduzione delle prestazioni.When the style sheet is loaded, any defined functions are compiled to Microsoft intermediate language (MSIL) by being wrapped in a class definition and have no performance loss as a result.

L'elemento <msxsl:script> viene definito di seguito:The <msxsl:script> element is defined below:

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

dove msxsl è un prefisso associato allo spazio dei nomi urn:schemas-microsoft-com:xslt.where msxsl is a prefix bound to the namespace urn:schemas-microsoft-com:xslt.

L'attributo language non è obbligatorio. Tuttavia, se specificato, deve presentare uno dei seguenti valori: C#, VB, JScript, JavaScript, VisualBasic o CSharp.The language attribute is not mandatory, but if specified, its value must be one of the following: C#, VB, JScript, JavaScript, VisualBasic, or CSharp. Se omesso, il linguaggio viene impostato su JScript.If not specified, the language defaults to JScript. Poiché nel language-name non viene fatta distinzione tra maiuscole e minuscole, "JavaScript" e "javascript" si equivalgono.The language-name is not case-sensitive, so 'JavaScript' and 'javascript' are equivalent.

L'attributo implements-prefix è obbligatorio.The implements-prefix attribute is mandatory. Questo attributo viene usato per dichiarare uno spazio dei nomi e associarlo al blocco di script.This attribute is used to declare a namespace and associate it with the script block. Il valore di questo attributo è il prefisso che rappresenta lo spazio dei nomi.The value of this attribute is the prefix that represents the namespace. È possibile definire lo spazio dei nomi in un punto qualsiasi di un foglio di stile.This namespace can be defined somewhere in a style sheet.

Poiché l'elemento msxsl:script appartiene allo spazio dei nomi urn:schemas-microsoft-com:xslt, il foglio di stile deve includere la dichiarazione dello spazio dei nomi xmlns:msxsl=urn:schemas-microsoft-com:xslt.Because the msxsl:script element belongs to the namespace urn:schemas-microsoft-com:xslt, the style sheet must include the namespace declaration xmlns:msxsl=urn:schemas-microsoft-com:xslt.

Se il chiamante dello script non dispone dell'autorizzazione di accesso SecurityPermissionFlag, lo script presente nel foglio di stile non verrà compilato e non sarà possibile eseguire la chiamata a Load.If the caller of the script does not have SecurityPermissionFlag access permission, then the script in a style sheet will never compile and the call to Load will fail.

Se il chiamante dispone dell'autorizzazione UnmanagedCode, lo script verrà compilato, ma le operazioni consentite dipenderanno dall'evidenza fornita in fase di caricamento.If the caller has UnmanagedCode permission, the script compiles, but the operations that are allowed are dependent on the evidence that is supplied at load time.

Se per il caricamento del foglio di stile si usa uno dei metodi Load che accettano un tipo XmlReader o XPathNavigator, è necessario usare il metodo di overload Load che accetta un parametro Evidence come argomento.If you are using one of the Load methods that take an XmlReader or XPathNavigator to load the style sheet, you need to use the Load overload that takes an Evidence parameter as one of its arguments. Per fornire l'evidenza, il chiamante deve disporre dell'autorizzazione SecurityPermissionFlag per fornire il parametro Evidence per l'assembly dello script.To provide evidence, the caller must have SecurityPermissionFlag permission to supply Evidence for the script assembly. Se il chiamante non dispone di questa autorizzazione, il parametro Evidence può essere impostato su null.If the caller does not have this permission, then they can set the Evidence parameter to null. In questo caso la funzione Load non viene eseguita se vengono rilevati degli script.This causes the Load function to fail if it finds script. L'autorizzazione ControlEvidence è molto efficace e deve essere concessa esclusivamente a codice completamente attendibile.The ControlEvidence permission is considered a very powerful permission that should only be granted to highly trusted code.

Per ottenere l'evidenza dall'assembly, usare this.GetType().Assembly.Evidence.To get the evidence from your assembly, use this.GetType().Assembly.Evidence. Per ottenere l'evidenza da un URI (Uniform Resource Identifier), usare Evidence e = XmlSecureResolver.CreateEvidenceForUrl(stylesheetURI).To get the evidence from a Uniform Resource Identifier (URI), use Evidence e = XmlSecureResolver.CreateEvidenceForUrl(stylesheetURI).

Se si usano i metodi Load che accettano un tipo XmlResolver e non dispongono del parametro Evidence, l'impostazione predefinita per l'area di sicurezza dell'assembly è Attendibilità totale.If you use Load methods that take an XmlResolver but no Evidence, the security zone for the assembly defaults to Full Trust. Per altre informazioni, vedere SecurityZone e Set di autorizzazioni denominati.For more information, see SecurityZone and Named Permission Sets.

È possibile dichiarare le funzioni all'interno dell'elemento msxsl:script.Functions can be declared within the msxsl:script element. Nella tabella seguente sono illustrati gli spazi dei nomi supportati per impostazione predefinita.The following table shows the namespaces that are supported by default. È possibile usare classi che non sono comprese negli spazi dei nomi elencati.You can use classes outside the listed namespaces. Tuttavia, è necessario che tali classi siano complete.However, these classes must be fully qualified.

Spazi dei nomi predefinitiDefault Namespaces DescrizioneDescription
SystemSystem Classe di sistema.System class.
System.CollectionSystem.Collection Classi Collection.Collection classes.
System.TextSystem.Text Classi di testo.Text classes.
System.Text.RegularExpressionsSystem.Text.RegularExpressions Classi di espressioni regolari.Regular expression classes.
System.XmlSystem.Xml Classi XML di base.Core XML classes.
System.Xml.XslSystem.Xml.Xsl Classi XSLT.XSLT classes.
System.Xml.XPathSystem.Xml.XPath Classi XPath (XML Path Language).XML Path Language (XPath) classes.
Microsoft.VisualBasicMicrosoft.VisualBasic Classi per gli script Microsoft Visual Basic.Classes for Microsoft Visual Basic scripts.

Quando si dichiara una funzione, questa è contenuta in un blocco di script.When a function is declared, it is contained in a script block. I fogli di stile possono contenere più blocchi di script con funzionamento indipendente l'uno dall'altro.Style sheets can contain multiple script blocks, each operating independent of the other. Ciò significa che, all'interno di un blocco di script, non è possibile chiamare una funzione definita in un altro blocco di script a meno che per quest'ultimo non sia dichiarato lo stesso spazio dei nomi e lo stesso linguaggio di script.That means that if you are executing inside a script block, you cannot call a function that you defined in another script block unless it is declared to have the same namespace and the same scripting language. Poiché ogni blocco di script può essere scritto nel proprio linguaggio e il blocco viene analizzato in base alle regole grammaticali del parser di quel linguaggio, è necessario usare la sintassi corretta per il linguaggio in uso.Because each script block can be in its own language, and the block is parsed according to the grammar rules of that language parser, you must use the correct syntax for the language in use. Ad esempio, in un blocco di script C# è un errore usare un nodo Comment XML <!-- an XML comment --> nel blocco.For example, if you are in a C# script block, then it is an error to use an XML comment node <!-- an XML comment --> in the block.

È necessario che gli argomenti forniti e i valori restituiti definiti dalle funzioni di script siano di tipo W3C (World Wide Web Consortium) XPath o XSLT.The supplied arguments and return values defined by the script functions must be one of the World Wide Web Consortium (W3C) XPath or XSLT types. Nella tabella seguente vengono mostrati i tipi W3C corrispondenti, le classi .NET Framework equivalenti (tipo) e se il tipo W3C è un tipo XPath o XSLT.The following table shows the corresponding W3C types, the equivalent .NET Framework classes (Type), and whether the W3C type is an XPath type or XSLT type.

TipoType Classe .NET Framework equivalente (tipo)Equivalent .NET Framework Class (Type) Tipo XPath o tipo XSLTXPath type or XSLT type
StringaString System.StringSystem.String XPathXPath
BooleanoBoolean System.BooleanSystem.Boolean XPathXPath
NumberNumber System.DoubleSystem.Double XPathXPath
Frammento di albero risultatoResult Tree Fragment System.Xml.XPath.XPathNavigatorSystem.Xml.XPath.XPathNavigator XSLTXSLT
Node setNode Set System.Xml.XPath.XPathNodeIteratorSystem.Xml.XPath.XPathNodeIterator XPathXPath

Se la funzione di script usa un tipo numerico quale Int16, UInt16, Int32, UInt32, Int64, UInt64, Single o Decimal, questo verrà convertito in Double, che corrisponde al numero del tipo W3C XPath.If the script function utilizes one of the following numeric types: Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, or Decimal, they are forced to Double, which maps to the W3C XPath type number. Tutti gli altri tipi verranno convertiti in stringhe usando il metodo ToString.All other types are forced to a string by calling the ToString method.

Se la funzione di script usa un tipo diverso da quelli specificati in precedenza o se la funzione non viene compilata quando il foglio di stile viene caricato nell'oggetto XslTransform, verrà generata un'eccezione.If the script function utilizes a type other than the ones mentioned above, or if the function does not compile when the style sheet is loaded into the XslTransform object, an exception is thrown.

Quando si usa l'elemento msxsl:script, si consiglia che tale script, indipendentemente dal linguaggio, venga inserito all'interno di una sezione CDATA.When using the msxsl:script element, it is highly recommended that the script, regardless of language, be placed inside a CDATA section. Nel codice XML seguente, ad esempio, viene illustrato il modello della sezione CDATA in cui è inserito il codice.For example, the following XML shows the template of the CDATA section where your code is placed.

<msxsl:script implements-prefix='yourprefix' language='CSharp'>  
    <![CDATA[  
    ... your code here ...  
    ]]>  
</msxsl:script>  

Si consiglia di inserire tutto il contenuto dello script in una sezione CDATA, poiché è possibile che gli operatori, gli identificatori o i delimitatori per un determinato linguaggio vengano erroneamente interpretati come XML.It is highly recommended that all script content be placed in a CDATA section, because operators, identifiers, or delimiters for a given language have the potential of being misinterpreted as XML. Nell'esempio seguente viene illustrato l'uso dell'operatore logico AND nello script.The following example shows the use of the logical AND operator in script.

<msxsl:script implements-prefix='yourprefix' language='CSharp>  
    public string book(string abc, string xyz)  
    {  if ((abc== abc)&&(abc== xyz)) return bar+xyz;  
        else return null;  
    }  
</msxsl:script>  

In questo esempio viene generata un'eccezione in quanto le e commerciali non sono in sequenza di escape.This throws an exception because the ampersands are not escaped. Il documento viene caricato come XML e non viene applicato alcun trattamento speciale al testo compreso tra i tag dell'elemento msxsl:script.The document is loaded as XML, and no special treatment is applied to the text between the msxsl:script element tags.

EsempioExample

Nell'esempio seguente viene usato uno script incorporato per calcolare la circonferenza di un cerchio di cui viene fornito il raggio.The following example uses an embedded script to calculate the circumference of a circle given its radius.

Imports System  
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()  

    'Create the XslTransform and load the style sheet.  
    Dim xslt As XslTransform = New XslTransform  
    xslt.Load(stylesheet)  

    'Load the XML data file.  
    Dim doc As XPathDocument = New XPathDocument(filename)  

    'Create an XmlTextWriter to output to the console.               
    Dim writer As XmlTextWriter = New XmlTextWriter(Console.Out)  
    writer.Formatting = Formatting.Indented  

    'Transform the file.  
    xslt.Transform(doc, Nothing, writer, Nothing)  
    writer.Close()  
  End Sub   
End Class  
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() {  

    //Create the XslTransform and load the style sheet.  
    XslTransform xslt = new XslTransform();  
    xslt.Load(stylesheet);  

    //Load the XML data file.  
    XPathDocument doc = new XPathDocument(filename);  

    //Create an XmlTextWriter to output to the console.               
    XmlTextWriter writer = new XmlTextWriter(Console.Out);  
    writer.Formatting = Formatting.Indented;  

    //Transform the file.  
    xslt.Transform(doc, null, writer, null);  
    writer.Close();  
  }   
}  

InputInput

number.xmlnumber.xml

<?xml version='1.0'?>  
<data>  
  <circle>  
    <radius>12</radius>  
  </circle>  
  <circle>  
    <radius>37.5</radius>  
  </circle>  
</data>  

calc.xslcalc.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>  

OutputOutput

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

Implementazione del processore XSLT da parte della classe XslTransformXslTransform Class Implements the XSLT Processor