230 likes | 573 Views
XPath. 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. Nodi.
E N D
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
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
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
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>
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)
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
Test dei nodi • Un asse seleziona un gruppo di nodi dall'albero in base ad un test dei nodi
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)
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>
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
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
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>
Lista operatori XPath • Pipe (|) • Unisce due gruppi di nodi • head | body (seleziona tutti gli elementi head e body che sono child del nodo di contesto) • Slash(/) • 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-or-self::node()/child()::body(seleziona tutti i nodi body dell'intero documento)
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
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
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"> <html> <body> <ul> <xsl:for-each select ="stock"> <xsl:if test = "starts-with(@symbol, 'C')"> <li> <xsl:value-of select = "concat(@symbol,' - ', name)"/> </li> </xsl:if> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet>