Implementazione del processore XSLT da parte della classe XslTransform

La classe XslTransform è un processore XSLT che implementa la raccomandazione XSL Transformations (XSLT) Versione 1.0. Il metodo Load individua e legge i fogli di stile, mentre il metodo Transform trasforma il documento di origine. Come documento di origine per XslTransform può essere utilizzato qualunque archivio che implementi l'interfaccia IXPathNavigable. Poiché .NET Framework implementa attualmente l'interfaccia IXPathNavigable in XmlDocument, XmlDataDocument e XPathDocument, è possibile utilizzare uno qualunque di questi elementi come documento di origine di input per una trasformazione.

L'oggetto XslTransform in .NET Framework supporta solo la specifica XSLT 1.0, definita con lo spazio dei nomi seguente:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  

Utilizzando il metodo Load, è possibile caricare il foglio di stile da una delle seguenti classi:

  • XPathNavigator
  • XmlReader
  • Una stringa che rappresenta un URL

Per ognuna delle classi di input sopra riportate, esiste un diverso metodo Load. Alcuni metodi richiedono come argomento una combinazione di una di queste classi con la classe XmlResolver. La classe XmlResolver consente di individuare le risorse a cui <xsl:import> o <xsl:include> fanno riferimento nel foglio di stile. Per i metodi seguenti, viene utilizzata come input una stringa XmlReader o XPathNavigator.

Overloads Public Sub Load(String)
[C#]
public void Load(string);
[Visual Basic]
Overloads Public Sub Load(String, XmlResolver)
[C#]
public void Load(string, XmlResolver);
[Visual Basic]
Overloads Public Sub Load(XmlReader, XmlResolver, Evidence)
[C#]
public void Load(XmlReader, XmlResolver, Evidence);
[Visual Basic]
Overloads Public Sub Load(XPathNavigator, XmlResolver, Evidence)
[C#]
public void Load(XPathNavigator, XmlResolver, Evidence);

Molti dei metodi Load sopra descritti accettano come parametro XmlResolver. Il parametro XmlResolver consente di caricare il foglio di stile e qualunque altro eventuale foglio di stile a cui viene fatto riferimento negli elementi xsl:import e xsl:include.

Molti dei metodi Load accettano come parametro anche Evidence, ossia l'elemento System.Security.Policy.Evidence associato al foglio di stile. Il livello di protezione del foglio di stile influenza il livello di protezione delle eventuali risorse a cui fa riferimento successivamente, quali lo script contenuto, le funzioni document() utilizzate e gli oggetti di estensione utilizzati da XsltArgumentList.

Se il foglio di stile viene caricato utilizzando il metodo Load contenente un parametro URL e nessun parametro Evidence, la prova del foglio di stile viene calcolata combinando l'URL con il sito e la zona relativi.

Se i parametri URI ed Evidence non vengono forniti, il parametro Evidence impostato per il foglio di stile è completamente attendibile. Non caricare fogli di stile da origini non attendibili né aggiungere a XslArgumentList oggetti di estensione non attendibili.

Per ulteriori informazioni sui metodi di overload Load, vedere Metodo XslTransform.Load. Per ulteriori informazioni sui livelli di protezione, sul parametro Evidence e su come questi influiscano sugli script, vedere Script dei fogli di stile XSLT utilizzando <msxml:script>. Per ulteriori informazioni sui livelli di protezione, sul parametro Evidence e su come questi influiscano sugli oggetti di estensione, vedere XsltArgumentList per i parametri dei fogli di stile e gli oggetti di estensione.

Per ulteriori informazioni sui livelli di protezione, sul parametro Evidence e su come questi influiscano sulla funzione document(), vedere Risoluzione di fogli di stile XSLT e documenti esterni.

Insieme al foglio di stile è possibile fornire vari parametri di input. È inoltre possibile utilizzare il foglio di stile per chiamare le funzioni sugli oggetti di estensione. Sia i parametri che gli oggetti di estensione vengono forniti al foglio di stile mediante la classe XsltArgumentList. Per ulteriori informazioni su XsltArgumentList, vedere Membri XsltArgumentList.

Uso protetto consigliato per la classe XslTransform

I privilegi di protezione del foglio di stile dipendono dal parametro Evidence. Nella tabella seguente vengono riportate la provenienza del foglio di stile e una spiegazione relativa al tipo di prova da fornire.

Scenario Tipo di prova da fornire
Il foglio di stile XSLT non ha riferimenti esterni oppure proviene da una base di codice attendibile. Fornire la prova dall'assembly:
Dim xslt = New XslTransform()
xslt.Load(stylesheet, resolver, Me.GetType().Assembly.Evidence)
[C#]
XsltTransform xslt = new XslTransform(); 
xslt.Load(stylesheet, resolver,
this.GetType().Assembly.Evidence);
Il foglio di stile XSLT proviene da un'origine esterna conosciuta e con un URI verificabile. Fornire la prova utilizzando l'URI.
Dim xslt As New XslTransform()
Dim ev As Evidence = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri)
xslt.Load(stylesheet, resolver, evidence)
[C#]
XslTransform xslt = new XslTransform();
Evidence ev = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri);
xslt.Load(stylesheet, resolver, evidence);
Il foglio di stile XSLT proviene da un'origine esterna sconosciuta. Impostare la prova su un riferimento null (Nothing in VB). I blocchi di script non vengono elaborati, la funzione XSLT document() non è supportata e gli oggetti di estensione privilegiati non sono consentiti.

È inoltre possibile impostare il parametro resolver su un riferimento null (Nothing) affinché gli elementi xsl:import e xsl:include non vengano elaborati.

Il foglio di stile XSLT proviene da un'origine esterna sconosciuta, ma è necessario disporre del supporto per gli script. Richiedere la prova al chiamante.

Trasformazione dei dati XML

Una volta caricato il foglio di stile, la trasformazione viene avviata chiamando uno dei metodi Transform e fornendo un documento di origine di input. Viene eseguito l'overload del metodo Transform per fornire output di trasformazione diversi. La trasformazione può dare luogo ai seguenti formati di output:

  • XmlReader
  • XmlWriter
  • TextWriter
  • Stream
  • URL di tipo String del file

Quest'ultimo formato, l'URL di stringa, è utile in uno scenario comunemente usato in cui un documento di input situato in un URL viene trasformato e scritto nell'URL di output. Questo metodo Transform è pratico quando si tratta di caricare un documento XML da un file, eseguire la trasformazione XSLT e scrivere l'output in un file. Questo evita all'utente di dover creare e caricare il documento di origine di input e quindi scrivere in un flusso di file. Nell'esempio di codice riportato di seguito, viene illustrato l'uso del metodo Transform con l'URL di stringa come input e output:

Dim xsltransform As XslTransform = New XslTransform()
xsltransform.Load("favorite.xsl")
xsltransform.Transform("MyDocument.Xml", "TransformResult.xml", Nothing)
[C#]
XslTransform xsltransform = new XslTransform();
xsltransform.Load("favorite.xsl");
xsltransform.Transform("MyDocument.xml", "TransformResult.xml", null);

Trasformazione di una sezione di un documento XML

Le trasformazioni vengono applicate all'intero documento. Questo significa, che anche se il nodo interessato non è di primo livello, il processo di trasformazione riguarda comunque tutti i nodi del documento caricato. Per trasformare un frammento di nodo, è necessario creare un XmlDocument contenente solamente tale frammento e passarlo al metodo Transform. Nell'esempio riportato di seguito viene illustrata l'esecuzione di una trasformazione su un frammento di nodo.

Dim xslt As New XslTransform()
xslt.Load("print_root.xsl")
Dim doc As New XmlDocument()
doc.Load("library.xml")
' Create a new document containing just the node fragment.
Dim testNode As XmlNode = doc.DocumentElement.FirstChild
Dim tmpDoc As New XmlDocument()
tmpDoc.LoadXml(testNode.OuterXml)
' Pass the document containing the node fragment 
' to the Transform method.
Console.WriteLine(("Passing " + tmpDoc.OuterXml + " to print_root.xsl"))
xslt.Transform(tmpDoc, Nothing, Console.Out, Nothing)
[C#]
XslTransform xslt = new XslTransform();     
xslt.Load("print_root.xsl");
XmlDocument doc = new XmlDocument();
doc.Load("library.xml");
// Create a new document containing just the node fragment.
XmlNode testNode = doc.DocumentElement.FirstChild; 
XmlDocument tmpDoc = new XmlDocument(); 
tmpDoc.LoadXml(testNode.OuterXml);
// Pass the document containing the node fragment 
// to the Transform method.
Console.WriteLine("Passing " + tmpDoc.OuterXml + " to print_root.xsl");
xslt.Transform(tmpDoc, null, Console.Out, null);

Nell'esempio vengono utilizzati come input i file library.xml e print_root.xsl e alla console viene restituito l'output seguente:

Passing <book genre="novel" ISBN="1-861001-57-5"><title>Pride And Prejudice</title></book> to print_root.xsl 
Root node is book.

library.xml

<library>
  <book genre='novel' ISBN='1-861001-57-5'>
     <title>Pride And Prejudice</title>
  </book>
  <book genre='novel' ISBN='1-81920-21-2'>
     <title>Hook</title>
  </book>
</library>

print_root.xsl

<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform" >
  <output method="text" /> 
  <template match="/">
     Root node is  <value-of select="local-name(//*[position() = 1])" /> 
  </template>
</stylesheet>

Migrazione di XSLT da .NET Framework versione 1.0 a .NET Framework versione 1.1

Nella tabella riportata di seguito sono elencati i metodi obsoleti di .NET Framework versione 1.0 e i nuovi metodi di .NET Framework versione 1.1 per XslTransform.Load. I nuovi metodi consentono di limitare le autorizzazioni dei fogli di stile specificando una prova.

Metodi Load di .NET Framework versione 1.0 Metodi Load sostitutivi di .NET Framework versione 1.1
Load(input XPathNavigator);

Load(input XPathNavigator, sistema di risoluzione XmlResolver);

Load(foglio di stile XPathNavigator, sistema di risoluzione XmlResolver, prova Evidence);
Load(foglio di stile IXPathNavigable);

Load(foglio di stile IXPathNavigable, sistema di risoluzione XmlResolver);

Load(foglio di stile IXPathNavigable, sistema di risoluzione XmlResolver, prova Evidence);
Load(foglio di stile XmlReader);

Load(foglio di stile XmlReader, sistema di risoluzione XmlResolver);

Load(foglio di stile XmlReader, sistema di risoluzione XmlResolver, prova Evidence);

Nella tabella riportata di seguito vengono mostrati i metodi obsoleti e nuovi di XslTransform.Transform. I nuovi metodi accettano un oggetto XmlResolver.

Metodi Tranform di .NET Framework versione 1.0 Metodi Transform sostitutivi di .NET Framework versione 1.1
XmlReader Transform(input XPathNavigator, argomenti XsltArgumentList) XmlReader Transform(input XPathNavigator, argomenti XsltArgumentList, sistema di risoluzione XmlResolver)
XmlReader Transform(input IXPathNavigable, argomenti XsltArgumentList) XmlReader Transform(input IXPathNavigable, argomenti XsltArgumentList, sistema di risoluzione XmlResolver)
Void Transform(input XPathNavigator, argomenti XsltArgumentList, output XmlWriter) Void Transform(input XPathNavigator, argomenti XsltArgumentList, output XmlWriter, sistema di risoluzione XmlResolver)
Void Transform(input IXPathNavigable, argomenti XsltArgumentList, output XmlWriter) Void Transform(input IXpathNavigable, argomenti XsltArgumentList, output XmlWriter, sistema di risoluzione XmlResolver)
Void Transform(input XPathNavigator, argomenti XsltArgumentList, output TextWriter) Void Transform(input XPathNavigator, argomenti XsltArgumentList, output TextWriter, sistema di risoluzione XmlResolver)
Void Transform(input IXPathNavigable, argomenti XsltArgumentList, output TextWriter) Void Transform(input IXPathNavigable, argomenti XsltArgumentList, output TextWriter, sistema di risoluzione XmlResolver)
Void Transform(input XPathNavigator, argomenti XsltArgumentList, output Stream) Void Transform(input XPathNavigator, argomenti XsltArgumentList, output Stream, sistema di risoluzione XmlResolver)
Void Transform(input IXPathNavigable, argomenti XsltArgumentList, output Stream) Void Transform(input IXPathNavigable, argomenti XsltArgumentList, output Stream, sistema di risoluzione XmlResolver)
Void Transform(input String, output String) Void Transform(input String, output String, sistema di risoluzione XmlResolver)

La proprietà XslTransform.XmlResolver non è più supportata in .NET Framework versione 1.1. Al suo posto è possibile utilizzare i nuovi overload Transform con un oggetto XmlResolver.

Vedere anche

Trasformazioni XSLT con la classe XslTransform | XPathNavigator nelle trasformazioni | XPathNodeIterator nelle trasformazioni | Input di XPathDocument in XslTransform | Input di XmlDataDocument in XslTransform | Input di XmlDocument in XslTransform | Classe XslTransform | Membri XslTransform