XPath - Guida rapida
Prima di imparare XPath, dovremmo prima capire XSL che sta per Extensible Stylesheet Langoscia. È simile a XML come CSS è a HTML.
Necessità di XSL
In caso di documenti HTML, i tag sono predefiniti come table, div, span, ecc. Il browser sa come aggiungere uno stile e visualizzarli utilizzando gli stili CSS. Ma nel caso di documenti XML, i tag non sono predefiniti. Per comprendere e definire lo stile di un documento XML,World Wide Web Consortium (W3C)ha sviluppato XSL che può agire come un linguaggio di fogli di stile basato su XML. Un documento XSL specifica come un browser deve eseguire il rendering di un documento XML.
Di seguito sono riportate le parti principali di XSL:
XSLT - utilizzato per trasformare i documenti XML in vari altri tipi di documenti.
XPath - utilizzato per navigare nei documenti XML.
XSL-FO - utilizzato per formattare documenti XML.
Cos'è XPath?
XPath è una raccomandazione ufficiale del World Wide Web Consortium (W3C). Definisce una lingua per trovare informazioni in un file XML. Viene utilizzato per attraversare elementi e attributi di un documento XML. XPath fornisce vari tipi di espressioni che possono essere utilizzate per richiedere informazioni rilevanti dal documento XML.
Structure Definitions - XPath definisce le parti di un documento XML come elemento, attributo, testo, spazio dei nomi, istruzione di elaborazione, commento e nodi del documento
Path Expressions - XPath fornisce potenti espressioni di percorso per selezionare i nodi o l'elenco dei nodi nei documenti XML.
Standard Functions - XPath fornisce una ricca libreria di funzioni standard per la manipolazione di valori di stringa, valori numerici, confronto di data e ora, manipolazione di nodi e QName, manipolazione di sequenze, valori booleani ecc.
Major part of XSLT - XPath è uno degli elementi principali nello standard XSLT ed è necessario disporre di conoscenze per poter lavorare con i documenti XSLT.
W3C recommendation - XPath è una raccomandazione ufficiale del World Wide Web Consortium (W3C).
Si dovrebbero tenere a mente i seguenti punti, mentre si lavora con XPath:
- XPath è un componente fondamentale dello standard XSLT .
- XSLT non può funzionare senza XPath.
- XPath è la base di XQuery e XPointer.
Un'espressione XPath generalmente definisce un modello per selezionare un insieme di nodi. Questi modelli vengono utilizzati da XSLT per eseguire trasformazioni o da XPointer per scopi di indirizzamento.
La specifica XPath specifica sette tipi di nodi che possono essere l'output dell'esecuzione dell'espressione XPath.
- Root
- Element
- Text
- Attribute
- Comment
- Istruzioni di elaborazione
- Namespace
XPath utilizza un'espressione di percorso per selezionare il nodo o un elenco di nodi da un documento XML.
Di seguito è riportato l'elenco di percorsi ed espressioni utili per selezionare qualsiasi nodo / elenco di nodi da un documento XML.
S.No. | Espressione e descrizione |
---|---|
1 | node-name Seleziona tutti i nodi con il nome specificato "nome nodo" |
2 | / La selezione inizia dal nodo radice |
3 | // La selezione inizia dal nodo corrente che corrisponde alla selezione |
4 | . Seleziona il nodo corrente |
5 | .. Seleziona il genitore del nodo corrente |
6 | @ Seleziona gli attributi |
7 | student Esempio: seleziona tutti i nodi con il nome "studente" |
8 | class/student Esempio: seleziona tutti gli elementi degli studenti che sono figli della classe |
9 | //student Seleziona tutti gli elementi degli studenti indipendentemente da dove si trovano nel documento |
Esempio
In questo esempio, abbiamo creato un documento XML di esempio, students.xml e il suo foglio di stile students.xsl che utilizza le espressioni XPath sotto select attributo di vari tag XSL per ottenere i valori di roll no, firstname, lastname, nickname e mark di ogni nodo studente.
students.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/">
<html>
<body>
<h2>Students</h2>
<table border = "1">
<tr bgcolor = "#9acd32">
<th>Roll No</th>
<th>First Name</th>
<th>Last Name</th>
<th>Nick Name</th>
<th>Marks</th>
</tr>
<xsl:for-each select = "class/student">
<tr>
<td> <xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Verifica l'output
In questo capitolo, vedremo l'espressione XPath in dettaglio che copre i tipi comuni di nodi, definisce e gestisce XPath.
S.No. | Tipo di nodo e descrizione |
---|---|
1 | Radice Nodo dell'elemento radice di un documento XML. |
2 | Elemento Nodo dell'elemento. |
3 | Testo Testo di un nodo elemento. |
4 | Attributo Attributo di un nodo elemento. |
5 | Commento Commento |
Il percorso della posizione specifica la posizione del nodo nel documento XML. Questo percorso può essere assoluto o relativo. Se il percorso della posizione inizia con il nodo radice o con "/", è un percorso assoluto. Di seguito sono riportati alcuni esempi di individuazione degli elementi utilizzando il percorso assoluto.
/class/student - seleziona i nodi studente all'interno del nodo radice della classe.
<xsl:for-each select = "/class/student">
/class/student/firstname - seleziona il nome di un nodo studente all'interno del nodo radice della classe.
<p><xsl:value-of select = "/class/student/firstname"/></p>
Esempio
In questo esempio, abbiamo creato un documento XML di esempio students.xml e il suo foglio di stile students.xsl che utilizza le espressioni XPath.
Di seguito è riportato l'XML di esempio utilizzato.
students.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/" >
<html>
<body>
<h3>Details of each Students. </h3>
<table border = "1">
<tr bgcolor = "#9acd32">
<th>Roll No</th>
<th>First Name</th>
<th>Last Name</th>
<th>Nick Name</th>
<th>Marks</th>
</tr>
<tr>
<td><xsl:value-of select = "/class/student[1]/@rollno"/></td>
<td><xsl:value-of select = "/class/student[1]/firstname"/></td>
<td><xsl:value-of select = "/class/student[1]/lastname"/></td>
<td><xsl:value-of select = "/class/student[1]/nickname"/></td>
<td><xsl:value-of select = "/class/student[1]/marks"/></td>
</tr>
<tr>
<td>
<xsl:value-of select = "/class/student/@rollno"/>
</td>
<td><xsl:value-of select = "/class/student[2]/firstname"/></td>
<td><xsl:value-of select = "/class/student[2]/lastname"/></td>
<td><xsl:value-of select = "/class/student[2]/nickname"/></td>
<td><xsl:value-of select = "/class/student[2]/marks"/></td>
</tr>
<tr>
<td>
<xsl:value-of select = "/class/student[3]/@rollno"/>
</td>
<td><xsl:value-of select = "/class/student[3]/firstname"/></td>
<td><xsl:value-of select = "/class/student[3]/lastname"/></td>
<td><xsl:value-of select = "/class/student[3]/nickname"/></td>
<td><xsl:value-of select = "/class/student[3]/marks"/></td>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Verifica l'output
Il percorso della posizione specifica la posizione del nodo nel documento XML. Questo percorso può essere assoluto o relativo. Se il percorso della posizione inizia con il nodo che abbiamo selezionato, è un percorso relativo.
Di seguito sono riportati alcuni esempi per individuare gli elementi utilizzando il percorso relativo.
firstname - seleziona il nome relativo ai nodi studente.
<p><xsl:value-of select = "firstname"/></p>
Esempio
In questo esempio, abbiamo creato un documento XML di esempio students.xml e il suo foglio di stile students.xsl che utilizza le espressioni XPath.
Di seguito è riportato l'XML di esempio utilizzato.
students.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/" >
<html>
<body>
<h3>Details of each Students. </h3>
<table border = "1">
<tr bgcolor = "#9acd32">
<th>Roll No</th>
<th>First Name</th>
<th>Last Name</th>
<th>Nick Name</th>
<th>Marks</th>
</tr>
<xsl:for-each select = "/class/student">
<tr>
<td><xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Verifica l'output
Poiché il percorso di posizione definisce la posizione di un nodo utilizzando il percorso assoluto o relativo, gli assi vengono utilizzati per identificare gli elementi in base alla loro relazione parent, child, sibling, ecc. Gli assi sono chiamati così perché si riferiscono all'asse su cui giacciono gli elementi rispetto a un elemento.
Di seguito è riportato l'elenco dei vari valori Axis.
S.No. | Asse e descrizione |
---|---|
1 | ancestor Rappresenta gli antenati del nodo corrente che includono i padri fino al nodo radice. |
2 | ancestor-or-self Rappresenta il nodo corrente e i suoi antenati. |
3 | attribute Rappresenta gli attributi del nodo corrente. |
4 | child Rappresenta gli elementi figlio del nodo corrente. |
5 | descendant Rappresenta i discendenti del nodo corrente. I discendenti includono i figli del nodo fino al nodo foglia (non più figli). |
6 | descendant-or-self Rappresenta il nodo corrente e i suoi discendenti. |
7 | following Rappresenta tutti i nodi che vengono dopo il nodo corrente. |
8 | following-sibling Rappresenta i seguenti fratelli del nodo di contesto. I fratelli sono allo stesso livello del nodo corrente e condividono il suo genitore. |
9 | namespace Rappresenta lo spazio dei nomi del nodo corrente. |
10 | parent Rappresenta il genitore del nodo corrente. |
11 | preceding Rappresenta tutti i nodi che vengono prima del nodo corrente (cioè prima del suo tag di apertura). |
12 | self Rappresenta il nodo corrente. |
Di seguito sono riportati alcuni esempi sugli usi degli assi.
firstname - seleziona il nome relativo ai nodi studente.
<p><xsl:value-of select = "firstname"/></p>
<xsl:value-of select = "/class/student/preceding-sibling::comment()"/>
Esempio
In questo esempio, abbiamo creato un documento XML di esempio students.xml e il suo foglio di stile students.xsl che utilizza le espressioni XPath.
Di seguito è riportato l'XML di esempio utilizzato.
students.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<!-- Comment: This is a list of student -->
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/" >
<html>
<body>
<xsl:value-of select = "/class/student/preceding-sibling::comment()"/>
<br/>
<xsl:text>First Student: </xsl:text>
<xsl:value-of select = "/class/student/child::firstname" />
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Verifica l'output
In questo capitolo vedremo gli operatori e le funzioni di XPath nei dettagli che coprono XPath di uso comune defines e handles. XPath definisce operatori e funzioni sui tipi Nodi, String, Number e Boolean.
Di seguito è riportato l'elenco di cui discuteremo.
S.No. | Operatori / funzioni e descrizione |
---|---|
1 | Operatori di confronto Operatori di confronto per confrontare i valori. |
2 | Operatori booleani Operatori booleani per controllare le funzionalità "and", "o" & "not". |
3 | Funzioni / operatori numerici Operatori / Funzioni sui numeri. |
4 | Funzioni stringa Varie funzioni di stringa. |
5 | Funzioni / operatori del nodo Varie funzioni e operatori che agiscono sui nodi. |
XPath definisce i seguenti caratteri jolly sui nodi da utilizzare con le espressioni XPath.
S.No. | WildCard e descrizione |
---|---|
1 | * utilizzato per abbinare qualsiasi nodo. |
2 | . utilizzato per abbinare il nodo corrente nel contesto. |
3 | @* utilizzato per abbinare qualsiasi attributo |
4 | node() utilizzato per abbinare nodi di qualsiasi tipo |
Esempio
Questo esempio crea una tabella di elementi <student> con i loro dettagli, ripetendo ogni studente.
students.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/">
<html>
<body>
<h2>Students</h2>
<xsl:apply-templates select = "class/*" />
</body>
</html>
</xsl:template>
<xsl:template match = "class/*">
<xsl:apply-templates select = "@rollno" />
<xsl:apply-templates select = "firstname" />
<xsl:apply-templates select = "lastname" />
<xsl:apply-templates select = "nickname" />
<xsl:apply-templates select = "marks" />
<br />
</xsl:template>
<xsl:template match = "@rollno">
<span style = "font-size = 22px;">
<xsl:value-of select = "." />
</span>
<br />
</xsl:template>
<xsl:template match = "firstname">
First Name:<span style = "color:blue;">
<xsl:value-of select = "." />
</span>
<br />
</xsl:template>
<xsl:template match = "lastname">
Last Name:<span style = "color:green;">
<xsl:value-of select = "." />
</span>
<br />
</xsl:template>
<xsl:template match = "nickname">
Nick Name:<span style = "color:red;">
<xsl:value-of select = "." />
</span>
<br />
</xsl:template>
<xsl:template match = "marks">
Marks:<span style = "color:gray;">
<xsl:value-of select = "." />
</span>
<br />
</xsl:template>
</xsl:stylesheet>
Verifica l'output
Predicato si riferisce all'espressione XPath scritta tra parentesi quadre. Si riferisce a limitare i nodi selezionati in un nodo impostato per alcune condizioni. Per esempio,
S.No. | Predicato e descrizione |
---|---|
1 | /class/student[1] Seleziona il primo elemento studente che è figlio dell'elemento classe. |
2 | /class/student[last()] Seleziona l'ultimo elemento studente che è figlio dell'elemento classe. |
3 | /class/student[@rolllno = 493] Seleziona l'elemento studente con rollno 493. |
4 | /class/student[marks>85] Seleziona l'elemento studente con voti> 85. |
Esempio
Questo esempio crea una tabella di elementi <student> con i loro dettagli, ripetendo ogni studente. Calcola la posizione del nodo studente e quindi stampa i dettagli dello studente insieme al numero di serie.
students.xml
<?xml version = "1.0"?>
<?xml-stylesheet type = "text/xsl" href = "students.xsl"?>
<class>
<student rollno = "393">
<firstname>Dinkar</firstname>
<lastname>Kad</lastname>
<nickname>Dinkar</nickname>
<marks>85</marks>
</student>
<student rollno = "493">
<firstname>Vaneet</firstname>
<lastname>Gupta</lastname>
<nickname>Vinni</nickname>
<marks>95</marks>
</student>
<student rollno = "593">
<firstname>Jasvir</firstname>
<lastname>Singh</lastname>
<nickname>Jazz</nickname>
<marks>90</marks>
</student>
</class>
students.xsl
<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:template match = "/">
<html>
<body>
<h2>Students</h2>
<table border = "1">
<tr bgcolor = "#9acd32">
<th>Roll No</th>
<th>First Name</th>
<th>Last Name</th>
<th>Nick Name</th>
<th>Marks</th>
</tr>
<xsl:for-each select = "/class/student[1]">
<tr>
<td><xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
<xsl:for-each select = "/class/student[last()]">
<tr>
<td><xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
<xsl:for-each select = "/class/student[@rollno = 493]">
<tr>
<td><xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
<xsl:for-each select = "/class/student[marks > 85]">
<tr>
<td><xsl:value-of select = "@rollno"/></td>
<td><xsl:value-of select = "firstname"/></td>
<td><xsl:value-of select = "lastname"/></td>
<td><xsl:value-of select = "nickname"/></td>
<td><xsl:value-of select = "marks"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>