XPath 1 What is XPath? ● XPath is a syntax for defining parts of an XML document ● XPath uses paths to define XML elements ● XPath defines a library of standard functions ● XPath is a major element in XSLT ● XPath is not written in XML ● XPath is a W3C Standard 2 Nodi ● ● In XPath un documento XML viene considerato una struttura ad albero composta da nodi Xpath ha 7 tipi di nodi: – Radice – Elemento – Attributo – Testo – Commento – Istruzione di elaborazione – Namespace 3 Nodi ● ● ● ● La struttura ad albero di Xpath ha un solo nodo radice Il nodo radice ed i nodi degli elementi contengono liste ordinate di nodi child (figli) Tutti i nodi tranne quello radice hanno un nodo parent (genitore) Possono essere nodi child solamente: – ● Elementi, commenti, testi, istruzioni di elaborazione Notare che anche se un nodo attributo o namespace può avere come parent un elemento o la radice, non viene considerato un figlio del suo parent 4 Tipi di Nodi XPath 5 Tipi di nodi XPath 6 Esempio di albero XPath <?xml version="1.0"?> <!-- Esempio di file XML --> <!-- per lo studio di XPath --> <book title="C++ How to Program" edition="3"> <sample> <![CDATA[ // C++ comment if ( this->getX() < 5 && value[ 0 ] != 3 ) cerr << this->displayError(); ]]> </sample> C++ How to Program by Deitel & Deitel </book> 7 L'albero relativo al file XML precedente Radice Commento Esempio di file XML Commento Per lo studio di XPath Elemento book Attributo Title C++ How to program Attributo Edition 3 Elemento Sample Testo // C++ comment if ( this->getX() < 5 && value[ 0 ] != 3 ) cerr << this->displayError(); Testo C++ How to Program by Deitel & Deitel 8 I path di posizione ● ● Un path di posizione e' un'espressione che specifica come spostarsi fra i nodi di un albero Xpath Un path di posizione è composto da: – Un asse – Un test dei nodi – Un predicato (facoltativo) 9 Gli assi ● Le ricerche iniziano sempre dal nodo di contesto – ● ● ● Selezionabile ad esempio con una istruzione match nelle trasformazioni XSL che vedremo poi Un asse indica quali nodi riferiti al nodo di contesto deveono essere inclusi nella ricerca L'asse determina la sequenza di ricerca – Diretta (vengono selezionati i nodi seguenti (child) di quello di contesto) – Inversa (vengono selezionati i nodi antecedenti (parent) a quello di contesto Tipo di nodo principale dell'asse: – Il tipo di nodo che l'asse puo' selezionare 10 Gli assi XPath 11 Test dei nodi ● Un asse seleziona un gruppo di nodi dall'albero in base ad un test dei nodi 12 Path di posizione = Assi + Test dei nodi ● ● ● I path di posizione sono formati da sequenze di passaggi di posizione separati da / Un passaggio di posizione è formato da: – Un asse – :: – Un test dei nodi – Un predicato (tra parentesi quadre, facoltativo) Esempi: – child::* (seleziona tutti i nodi degli elementi child del nodo di contesto) – child::text() (seleziona tutti i nodi di testo child del nodo di contesto) – child::body (seleziona tutti i nodi dell'elemento body che sono child del nodo di contesto) 13 Esempio ● Dal file XML seguente si vogliono selezionare tutti i libri tradotti in giapponese, in una o più edizioni <?xml version="1.0"?> <!-- Fig. 11.9 : books.xml --> <!-- XML book list --> <books> <book> <title>Java How to Program</title> <translation edition="1">Spanish</translation> <translation edition="1">Chinese</translation> <translation edition="1">Japanese</translation> <translation edition="2">French</translation> <translation edition="2">Japanese</translation> </book> <book> <title>C++ How to Program</title> <translation edition="1">Korean</translation> <translation edition="2">French</translation> <translation edition="2">Spanish</translation> <translation edition="3">Italian</translation> <translation edition="3">Japanese</translation> </book> </books> 14 Esempio ● ● Si supponga che il nodo radice (books) sia il nodo di contesto Il path di posizione da utilizzare per selezionare l'elemento title di qualunque libro tradotto in giapponese è: /books/book/translation[. = 'japanese']/../title ● Il path di posizione da utilizzare per selezionare l'attributo edition di qualunque libro tradotto in giapponese è: /books/book/translation[. = 'japanese']/@edition 15 Operatori e funzioni ● ● Gli operatori XPath consentono di manipolare i gruppi di nodi selezionati con i path di posizione per formare altri gruppi Le funzioni XPath permettono di svolgere operazioni su un gruppo di nodi 16 File XML con Namespace <?xml version="1.0"?> <!-- Fig. 11.3 : simple2.xml --> <!-- Processing instructions and namespacess --> <html xmlns="http://www.w3.org/TR/REC-html40"> <head> <title>Processing Instruction and Namespace Nodes</title> </head> <?deitelprocessor example = "fig11_03.xml"?> <body> <deitel:book deitel:edition="1" xmlns:deitel="http://www.deitel.com/xmlhtp1"> <deitel:title>XML How to Program</deitel:title> </deitel:book> </body> </html> 17 Lista operatori XPath ● Pipe (|) – – ● Slash(/) – – ● Unisce due gruppi di nodi head | body (seleziona tutti gli elementi head e body che sono child del nodo di contesto) Separa i passaggi di posizione head/title[ last () ] (seleziona l'ultimo nodo dell'elemento title che è contenuto in head) Doppio Slash (//) – Equivalente a /descendant-or-self::node()/ – //body è equivalente a /descendant-orself::node()/child()::body (seleziona tutti i nodi body dell'intero documento) 18 Lista funzioni XPath 19 Esempi di funzioni ● book [ position()=3 ] (oppure book[ 3 ]) Seleziona il terzo elemento book del nodo di contesto ● count (*) restituisce il numero totale di elementi che sono child del nodo di contesto ● //book seleziona tutti i nodi dell'elemento book 20 Esempio sigle società di borsa <?xml version="1.0"?> <!-- Fig. 11.13 : stocks.xml --> <!-- Stock list --> <stocks> <stock symbol="INTC"> <name>Intel Corporation</name> </stock> <stock symbol="CSCO"> <name>Cisco Systems, Inc.</name> </stock> <stock symbol="DELL"> <name>Dell Computer Corporation</name> </stock> <stock symbol="MSFT"> <name>Microsoft Corporation</name> </stock> <stock symbol="SUNW"> <name>Sun Microsystems, Inc.</name> </stock> <stock symbol="CMGI"> <name>CMGI, Inc.</name> </stock> </stocks> Vogliamo selezionare tutte le società la cui sigla inizia per C 21 Foglio di stile per società di borsa <?xml version = "1.0"?> <!-- Fig. 11.14 : stocks.xsl --> <!-- string function usage --> <xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"> <xsl:template match = "/stocks"> Selezione del nodo di contesto <html> <body> <ul> <xsl:for-each select = "stock"> <xsl:if test = "starts-with(@symbol, 'C')"> <li> Funzione starts-with <xsl:value-of select = "concat(@symbol,' - ', name)"/> </li> </xsl:if> </xsl:for-each> Concatenazione della sigla con il nome </ul> </body> </html> </xsl:template> </xsl:stylesheet> 22 Risultato 23