XPath
Qué és XPath?
XPath (XML Path Language) és un llenguatge de consulta per navegar i seleccionar nodes en un document XML. És la base de XSLT, XQuery i moltes API de processament XML.
Un document XML es representa com un arbre de nodes amb: - Node document (arrel de l'arbre) - Nodes element, atribut, text, comentari, instrucció de processament
Expressions de camí (Location Paths)
Una expressió XPath retorna un conjunt de nodes:
/biblioteca <!-- element arrel 'biblioteca' -->
/biblioteca/llibre <!-- tots els 'llibre' fills de 'biblioteca' -->
//autor <!-- tots els 'autor' al document -->
/biblioteca/llibre/titol/text() <!-- text dels títols -->
//llibre/@isbn <!-- atribut isbn de tots els llibres -->
Camins absoluts vs relatius
<!-- Absolut: des de l'arrel del document -->
/biblioteca/llibre[1]/titol
<!-- Relatiu: des del node context actual (usat dins XSLT) -->
titol
autor/nom
../titol <!-- node pare, després el seu fill 'titol' -->
Eixos (Axes)
Els eixos defineixen la direcció de la navegació des del node context:
| Eix | Abreviatura | Descripció |
|---|---|---|
child:: |
(per defecte) | Fills directes |
parent:: |
.. |
Pare |
self:: |
. |
Node actual |
descendant:: |
// |
Tots els descendents |
ancestor:: |
— | Tots els avantpassats |
following-sibling:: |
— | Germans que segueixen |
preceding-sibling:: |
— | Germans que precedeixen |
attribute:: |
@ |
Atributs |
child::llibre <!-- equivalent a: llibre -->
attribute::isbn <!-- equivalent a: @isbn -->
parent::biblioteca <!-- el pare que és 'biblioteca' -->
ancestor::* <!-- tots els avantpassats -->
descendant::autor <!-- tots els 'autor' en qualsevol nivell -->
following-sibling::* <!-- germans que segueixen el node actual -->
Predicats
Els predicats filtren nodes:
/biblioteca/llibre[1] <!-- primer llibre -->
/biblioteca/llibre[last()] <!-- últim llibre -->
/biblioteca/llibre[last()-1] <!-- penúltim llibre -->
//llibre[@isbn] <!-- llibres amb atribut isbn -->
//llibre[@idioma='ca'] <!-- llibres en català -->
//autor[nom='Joanot'] <!-- autors amb nom Joanot -->
//llibre[any > 2000] <!-- llibres posteriors al 2000 -->
//llibre[count(autor) > 1] <!-- llibres amb més d'un autor -->
Operadors
<!-- Operadors de comparació -->
= != < > <= >=
<!-- Operadors lògics -->
and or not()
<!-- Operador unió -->
//titol | //autor <!-- nodes titol O nodes autor -->
<!-- Exemples -->
//llibre[@any >= 1900 and @any < 2000]
//llibre[@idioma='ca' or @idioma='es']
//producte[not(@actiu='false')]
Funcions XPath
Funcions numèriques
count(//llibre) <!-- nombre total de llibres -->
sum(//preu) <!-- suma de tots els preus -->
round(3.7) <!-- 4 -->
floor(3.9) <!-- 3 -->
ceiling(3.1) <!-- 4 -->
Funcions de cadena
string-length('hola') <!-- 4 -->
concat('Hola', ' ', 'món') <!-- 'Hola món' -->
substring('Biblioteca', 1, 5) <!-- 'Bibli' -->
contains('Biblioteca', 'teca') <!-- true -->
starts-with('Barcelona', 'Bar') <!-- true -->
normalize-space(' hola món ') <!-- 'hola món' -->
translate('abcdef', 'ace', 'ACE') <!-- 'AbCdEf' -->
Funcions de node
name() <!-- nom de l'element context -->
local-name() <!-- nom sense prefix de namespace -->
position() <!-- posició del node en el context -->
last() <!-- índex de l'últim node -->
Exemples pràctics
Document de referència:
<biblioteca>
<llibre isbn="L001" idioma="ca">
<titol>Tirant lo Blanc</titol>
<autor><nom>Joanot</nom><cognom>Martorell</cognom></autor>
<any>1490</any>
<preu>25.90</preu>
</llibre>
<llibre isbn="L002" idioma="es">
<titol>Don Quijote</titol>
<autor><nom>Miguel</nom><cognom>Cervantes</cognom></autor>
<any>1605</any>
<preu>18.50</preu>
</llibre>
<llibre isbn="L003" idioma="ca">
<titol>La plaça del Diamant</titol>
<autor><nom>Mercè</nom><cognom>Rodoreda</cognom></autor>
<any>1962</any>
<preu>14.95</preu>
</llibre>
</biblioteca>
/* Tots els títols */
//titol/text()
/* Llibres en català */
//llibre[@idioma='ca']
/* Nombre de llibres */
count(//llibre) /* → 3 */
/* Cognom del primer autor */
/biblioteca/llibre[1]/autor/cognom/text() /* → Martorell */
/* Llibres amb preu inferior a 20 */
//llibre[preu < 20]
/* Suma total de preus */
sum(//preu) /* → 59.35 */
/* Títol del llibre més barat */
//llibre[preu = min(//preu)]/titol/text()
Miniactivitat AC03740
Utilitza l'eina online XPath Tester (xmlgrid.net/xpathTester.html) o l'extensió XML de VS Code. Sobre el document biblioteca.xml del RA1, escriu expressions XPath per obtenir: (1) tots els autors, (2) el titol del darrer llibre, (3) nombres de llibres en català, (4) ISBN de tots els llibres posteriors a 1900.