XPathNavigator nelle trasformazioni

La classe XPathNavigator fornisce un accesso casuale di sola lettura ai dati ed è progettata per essere utilizzata come input per l'XSLT. Viene implementata su XPathDocument, XmlDataDocument e XmlDocument. XPathNavigator è basato sul modello di dati W3C secondo la descrizione fornita nella sezione 5 della raccomandazione XML Path Language (XPath).

XPathNavigator definisce un modello a cursore sopra ogni archivio e fornisce query XPath veloci e di sola lettura per qualsiasi archivio dati. XPathNavigator è inoltre la classe da utilizzare per l'esecuzione di iterazioni sui frammenti di struttura risultato.

L'API consente di ottenere informazioni dal nodo corrente nell'archivio e di spostare i nodi collegati. XPathNavigator è un modello di tipo cursore che esegue l'attraversamento di un archivio utilizzando un gruppo di metodi Move. XPathNavigator viene sempre posizionato su un nodo. Qualsiasi metodo Move che non riesce lascia XPathNavigator immutato.

XPathNavigator è la classe da utilizzare per eseguire l'iterazione sui frammenti di un nodo. Nell'esempio di codice riportato di seguito viene illustrata la creazione di un frammento di struttura risultato all'interno di un foglio di stile, richiamando la funzione con il parametro, fragment, che contiene l'XML

test.xsl

<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="fragment">
    <authorlist>
       <author>Joe</author>
    </authorlist>
</xsl:variable>

<msxsl:script language="C#" implements-prefix="user">
<![CDATA[
   string NodeFragment(XPathNavigator nav)
   {
      if (nav.HasChildren)
        return nav.Value;
      else
        return "";
   }
]]>
</msxsl:script>

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

</xsl:stylesheet>

test.xml

<root>Some text</root>

Nell'esempio riportato di seguito vengono utilizzati il foglio di stile test.xsl e i dati di input test.xml.

Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.Xsl
Imports System.Xml.XPath
Imports System.Text
Public Class sample

    Public Shared Sub Main()
        Dim xslt As New XslTransform()
        xslt.Load("test.xsl")

        Dim xd As New XPathDocument("test.xml")

        Dim strmTemp = New FileStream("out.xml", FileMode.Create, FileAccess.ReadWrite)
        xslt.Transform(xd, Nothing, strmTemp, Nothing)
    End Sub 'Main
End Class 'sample
[C#]
using System;
using System.IO;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;
using System.Text;

public class sample
{
    public static void Main()
    {
        XslTransform xslt = new XslTransform();
        xslt.Load("test.xsl");

        XPathDocument xd = new XPathDocument("test.xml");

        Stream strmTemp = new FileStream("out.xml", FileMode.Create, FileAccess.ReadWrite);
        xslt.Transform(xd, null, strmTemp, null);
    }
}

Il risultato della trasformazione è riportato nel file out.xml.

Output (out.xml)

<?xml version="1.0" encoding="utf-8"?>Joe

Vedere anche

Implementazione del processore XSLT da parte della classe XslTransform