XPathNodeIterator nelle trasformazioni

XPathNodeIterator fornisce i metodi necessari per eseguire iterazioni in un gruppo di nodi risultante da una query XPath o in un frammento di struttura risultato convertito in gruppo di nodi tramite il metodo node-set. XPathNodeIterator consente di eseguire un'iterazione sui nodi appartenenti al gruppo di nodi. Una volta recuperato un gruppo di nodi, la classe XPathNodeIterator fornisce un cursore forward-only di sola lettura al gruppo di nodi selezionato. Il gruppo di nodi viene creato in ordine di documento, quindi richiamando il metodo ci si sposta al nodo successivo in ordine di documento. XPathNodeIterator non crea una struttura con tutti i nodi del gruppo, ma fornisce una finestra con un singolo nodo nei dati, che espone il nodo sottostante al quale punta, quando ci si sposta all'interno della struttura. I metodi e le proprietà della classe XPathNodeIterator consentono di ricevere informazioni relative al nodo corrente. Per un elenco dei metodi e delle proprietà disponibili, vedere XPathNodeIterator Members.

Poiché un XPathNodeIterator si sposta sopra un gruppo di nodi creato da una query XPath e si sposta solo in avanti, per spostarsi è necessario utilizzare il metodo MoveNext. Il tipo restituito dal metodo è di tipo Boolean, con valore true se viene eseguito lo spostamento al nodo successivo selezionato e false se non vi sono altri nodi selezionati. Se viene restituito il valore true, nell'elenco seguente verranno illustrate le proprietà disponibili:

  • Current
  • CurrentPosition
  • Count

La prima volta che si visualizza un gruppo di nodi, è necessario effettuare una chiamata a MoveNext per posizionare XPathNodeIterator sul primo nodo del gruppo selezionato. In questo modo è possibile scrivere un ciclo while.

Nell'esempio riportato di seguito viene illustrato come passare XPathNodeIterator come parametro a XslTransform in XsltArgumentList. L'input per il codice è books.xml, mentre text.xsl è il foglio di stile. Il file test.xml è l'elemento XPathDocument.

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 Doc As New XPathDocument("books.xml")
      Dim nav As XPathNavigator = Doc.CreateNavigator()
      Dim Iterator As XPathNodeIterator = nav.Select("/bookstore/book")

      Dim arg As New XsltArgumentList()
      arg.AddParam("param1", "", Iterator)

      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, arg, 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()
    {
        XPathDocument Doc = new XPathDocument("books.xml");
        XPathNavigator nav = Doc.CreateNavigator();
        XPathNodeIterator Iterator = nav.Select("/bookstore/book");

        XsltArgumentList arg = new XsltArgumentList();
        arg.AddParam("param1", "", Iterator);

        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, arg, strmTemp, null);
    }
}

books.xml

<?xml version='1.0'?>
<!-- This file represents a fragment of a book store inventory database -->
<bookstore specialty="novel">
    <book style="autobiography">
    <title>Seven Years in Trenton</title>
        <author>
            <first-name>Joe</first-name>
            <last-name>Bob</last-name>
            <award>Trenton Literary Review Honorable Mention</award>
            <country>USA</country>
        </author>
        <price>12</price>
    </book>
    <book style="textbook">
        <title>History of Trenton</title>
        <author>
            <first-name>Mary</first-name>
            <last-name>Bob</last-name>
            <publication>
                Selected Short Stories of
                <first-name>JoeBob</first-name>
                <last-name>Loser</last-name>
                <country>US</country>
            </publication>
        </author>
        <price>55</price>
    </book>
</bookstore>

test.xsl

[Visual Basic, C#]

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

<xsl:output method="xml" indent="yes"/>
<xsl:param name="param1"/>

<xsl:template match="/">
    <out>
        <xsl:for-each select="$param1/title">
            <title><xsl:value-of select="."/></title>
        </xsl:for-each>
    </out>
</xsl:template>

</xsl:stylesheet>

test.xml

<Title attr="Test">this is a test</Title>

Output (out.xml)

<?xml version="1.0" encoding="utf-8"?>
<out>
  <title>Seven Years in Trenton</title>
  <title>History of Trenton</title>
</out>

Vedere anche

Implementazione del processore XSLT da parte della classe XslTransform