Salta el contingut

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.