Frammento di alberi risultato nelle trasformazioniResult Tree Fragment in Transformations

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.

I frammenti di nodi, detti anche frammenti di albero risultato, sono semplicemente un particolare tipo di set di nodi.Result tree fragments, also known as result tree fragments, are nothing more than a special type of node set. Sui frammenti di nodi è possibile eseguire le stesse funzioni che sono eseguibili sui set di nodi.You can perform any function on them that can be performed on a node set. È inoltre possibile usare la funzione node-set() per convertire un frammento di albero risultato in un set di nodi, quindi usarlo in qualsiasi posizione adatta.Or, you can also convert a result tree fragment to a node set using the node-set() function and subsequently use it any place that a node set can be used.

Un frammento di albero risultato viene creato usando in modo specifico un elemento <xsl:variable> o <xsl:param> in un foglio di stile.A result tree fragment is created as a result of using an <xsl:variable> or <xsl:param> element in a specific manner in a style sheet. La sintassi degli elementi variable e parameter è la seguente:The syntax for the variable and parameter elements is as follows:

<xsl:param name=Qname select= XPath Expression >  
    template body  
</xsl:param>  

<xsl:variable name=Qname select=XPath Expression >  
    template body  
</xsl:variable>  

Il valore del nome completo (parameter) dell'elemento Qname può essere assegnato in vari modi.For the parameter element, the value is assigned to the qualified name (Qname) in several ways. È possibile assegnare al parametro un valore predefinito tramite il contenuto restituito dall'espressione XPath nell'attributo select oppure usando il contenuto del corpo del modello.You can assign a default value to the parameter by returning content from the XML Path Language (XPath) expression in the select attribute, or by assigning it the contents of the template body.

Anche il valore dell'elemento variable può essere assegnato in diversi modi.For the variable element, the value is also assigned in several ways. È possibile assegnarlo tramite il contenuto restituito dall'espressione XPath nell'attributo select oppure usando il contenuto del corpo del modello.You can assign it by returning content from the XPath expression in the select attribute, or by assigning it the contents of the template body.

Da entrambi gli elementi parameter e variable, se viene assegnato un valore dall'espressione XPath, viene restituito uno dei quattro tipi XPath principali: Boolean, string, number o node set.For both the parameter and variable elements, if a value is assigned by the XPath expression, then one of the four basic XPath types will be returned: Boolean, string, number, or node set. Se il valore viene assegnato usando un corpo del modello non vuoto, verrà restituito un tipo di dati non XPath, ovvero un frammento di albero risultato.When the value is given by using a non-empty template body, then a non-XPath data type is returned, and that will be a result tree fragment.

Una query XPath restituisce un tipo di dati che non appartiene a uno dei quattro tipi di oggetti XPath unicamente nel caso in cui una variabile è associata a un frammento di albero risultato, anziché a uno dei quattro tipi di dati XPath di base.When a variable is bound to a result tree fragment instead of one of the four basic XPath data types, this is the only time that an XPath query returns a type that is not one of the four XPath object types. I frammenti di albero risultato e il relativo comportamento sono descritti nella specifica W3C, all'indirizzo http://www.w3.org/XSLT, dalla sezione 11.1 Result Tree Fragments (Frammenti di albero risultato) alla sezione 11.6 Passing Parameters to Templates (Passaggio di parametri ai modelli).Result tree fragments and their behavior are discussed in the World Wide Web Consortium (W3C) specification at www.w3.org/XSLT, section 11.1 Result Tree Fragments through section 11.6 Passing Parameters to Templates. Inoltre, nella sezione 1, Introduction, viene illustrato come i modelli possono contenere elementi dello spazio dei nomi XSLT che restituiscono o creano frammenti di albero risultato.Also, section 1 Introduction discusses how templates can contain elements from the XSLT namespace that return or create result tree fragments.

Un frammento di albero risultato si comporta, teoricamente, come un set di nodi con un unico nodo radice,A result tree fragment, in concept, behaves like a node set with nothing more than a single root node. mentre gli altri nodi restituiti sono nodi figlio.However, the rest of the nodes returned are child nodes. Per visualizzare i nodi figlio a livello di codice, copiare il frammento di albero risultato nell'albero risultato stessa usando l'elemento <xsl:copy-of>.To programmatically see the child nodes, copy the result tree fragment to the result tree using the <xsl:copy-of> element. Questa operazione consente di copiare in sequenza tutti i nodi figlio nell'albero risultato.When the copy-of is performed, all the child nodes are also copied to the result tree in sequence. Il frammento di albero risultato non farà parte dell'albero risultato o dell'output della trasformazione finché non viene usato un comando copy o copy-of.Until a copy or copy-of is used, a result tree fragment is not part of the result tree or the output from the transformation.

Per eseguire un'iterazione sui nodi restituiti in un frammento di albero risultato, usare XPathNavigator.To iterate over the returned nodes of a result tree fragment, an XPathNavigator is used. Nel codice di esempio seguente viene illustrata la creazione di un frammento di albero risultato in un foglio di stile, chiamando la funzione con un parametro fragment contenente dati XML.The following code sample shows how to create a result tree fragment within a style sheet by calling the function with a parameter fragment, which contains XML.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"  
                xmlns:user="http://www.adventure-works.com"  
                version="1.0">  
    <xsl:var name="fragment">  
        <node1>  
            <node2/>  
        </node1>  
    <xsl:var>  

  <msxsl:script language="C#" implements-prefix="user">  
    function NodeFragment(XPathNavigator nav)  
    {  
      if (nav.HasSelection == false)  
        XPathNavigator.MoveToNext();  
      return;  
    }  
  </msxsl:script>  

    <xsl:template match="/">  
            <xsl:value-of select="user:NodeFragment(msxml:node-set($fragment))"/>  
    </xsl:template>  
</xsl:stylesheet>  

Di seguito è riportato un altro esempio in cui viene mostrata una variabile, in RTF (Rich Text Format) e, di conseguenza, un tipo di frammento di albero risultato nodo non convertito in un set di nodi.Here is another sample showing a variable, which is in Rich Text Format (RTF), and hence, a type of result tree fragment, that is not converted to a node set. Il frammento viene passato a una funzione script e per esplorare i nodi viene usato il tipo XPathNavigator.Instead, it is passed to a script function, and the XPathNavigator is used to navigate over the nodes.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
        xmlns:msxsl="urn:schemas-microsoft-com:xslt"  
        xmlns:user="urn:books"  
        exclude-result-prefixes="msxsl">  

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>  

<xsl:variable name="node-fragment">  
    <book>Book1</book>  
    <book>Book2</book>  
    <book>Book3</book>  
    <book>Book4</book>  
</xsl:variable>  

<msxsl:script implements-prefix="user" language="c#">  

<![CDATA[  
    string func(XPathNavigator nav)  
    {  
        bool b = nav.MoveToFirstChild();  
        if (b)  
            return nav.Value;  
        else  
            return "Does not exist";  
    }  

]]>  

</msxsl:script>  

<xsl:template match="/">  
    <first_book>  
        <xsl:value-of select="user:func($node-fragment)"/>  
    </first_book>  
</xsl:template>  

</xsl:stylesheet>  

Il risultato della trasformazione dei dati XML ottenuto usando questo foglio di stile è illustrato nell'output seguente.The result of transforming any XML with this style sheet is shown in the following output.

OutputOutput

<first_book xmlns:user="urn:books">Book1</first_book>  

Come descritto in precedenza, la funzione node-set consente di convertire un frammento di albero risultato in un set di nodi.As stated above, the node-set function enables you to convert a result tree fragment into a node set. Il nodo risultante contiene sempre un nodo singolo, costituito dal nodo radice dell'albero.The resulting node always contains a single node that is the root node of the tree. Se un frammento di albero risultato viene convertito in un set di nodi, potrà essere usato come un normale set di nodi, ad esempio in un'istruzione for-each oppure nel valore di un attributo select.If you convert a result tree fragment to a node set, then you can use it anywhere a regular node set is used, such as in a for-each statement or in the value of a select attribute. Nelle righe di codice seguenti viene mostrato un frammento convertito in un set di nodi e usato come tale:The following lines of code show the fragment being converted to a node set and used as a node set:

<xsl:for-each select="msxsl:node-set($node-fragment)">

<xsl:value-of select="user:func(msxsl:node-set($node-fragment))"/>

Per esplorare un frammento convertito in un set di nodi non viene più usato XPathNavigator, bensìWhen a fragment is converted to a node set, you no longer use the XPathNavigator to navigate over it. XPathNodeIterator.For a node set, you use the XPathNodeIterator instead.

Nell'esempio seguente $var è una variabile che rappresenta l'albero dei nodi del foglio di stile.In the following example, $var is a variable that is a node tree in the style sheet. L'istruzione for-each combinata con la funzione node-set consente all'utente di eseguire un'iterazione su questo albero come set di nodi.The for-each statement, combined with the node-set function, allows the user to iterate over this tree as a node set.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"  
                xmlns:user="http://www.adventure-works.com"  
                version="1.0">  
    <xsl:variable name="states">  
        <node1>AL</node1>  
        <node1>CA</node1>  
        <node1>CO</node1>  
        <node1>WA</node1>  
    </xsl:variable>  

    <xsl:template match="/">  
            <xsl:for-each select="msxsl:node-set($states)"/>   
    </xsl:template>  
</xsl:stylesheet>  

Di seguito è riportato un altro esempio di variabile in formato RTF, quindi di tipo frammento di albero risultato, convertita in set di nodi prima di essere passata a una funzione script come "XPathNodeIterator".Here is another example of a variable that is in RTF, and hence of type result tree fragment, that is converted to a node set before being passed to a script function as XPathNodeIterator.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
        xmlns:msxsl="urn:schemas-microsoft-com:xslt"  
        xmlns:user="urn:books"  
        exclude-result-prefixes="msxsl">  

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>  

<xsl:variable name="node-fragment">  
    <book>Book1</book>  
    <book>Book2</book>  
    <book>Book3</book>  
    <book>Book4</book>  
</xsl:variable>  

<msxsl:script implements-prefix="user" language="c#">  

<![CDATA[  
    string func(XPathNodeIterator it)  
    {  
        it.MoveNext();   
        return it.Current.Value;   
        //it.Current returns XPathNavigator positioned on the current node  
    }  

]]>  

</msxsl:script>  
<xsl:template match="/">  
    <books>  
        <xsl:value-of select="user:func(msxsl:node-set($node-fragment))"/>  
    </books>  
</xsl:template>  

</xsl:stylesheet>  

Il risultato della trasformazione di dati XML con il presente foglio di stile è il seguente:The following is the result of transforming XML with this style sheet:

<books xmlns:user="urn:books">Book1Book2Book3Book4</books>  

Vedere ancheSee Also

XPathNodeIterator
XPathNodeIterator
Trasformazioni XSLT con la classe XslTransformXSLT Transformations with the XslTransform Class
Implementazione del processore XSLT da parte della classe XslTransformXslTransform Class Implements the XSLT Processor