Omet navegació

4.2.1.3 - Seqüències

Una seqüència és una expressió XPath que retorna més d’un element. S’assemblen prou a les llistes d’altres llenguatges:

  • Tenen ordre
  • Permeten duplicats
  • Poden contenir valors de tipus diferent en cada terme

És fàcil crear seqüències, ja que només cal tancar-les entre parèntesis i separar cadascun dels termes amb comes. L’expressió següent aplicada a qualsevol document: 

(1,2,3,4)

Retorna la seqüència de nombres d’un en un:

1
2
3
4

També es poden crear seqüències a partir d’expressions XPath. En aquest cas s’avaluarà primer la primera expressió, després la segona, etc. 

(//alumnes//nom/text() , //cognoms/text())

 Aplicat al nostre exemple retornarà primer tots els noms dels alumnes i després tots els cognoms (de professor i alumnes): 

Albert
Bernat
Joan
Puig
Alegre
Balaguer
Centelles

 

Unió, Intersecció i disjunció

També es pot operar amb les seqüències d’elements amb els operadors d’unió (union), intersecció (intersec) o disjunció (except). El resultat serà una altra seqüència on no hi haurà elements duplicats.

Anem a utilitzar com a exemple dues seqüències relativament fàcils de construir:

  • el nom dels alumnes aprovats (Albert i Joan): //alumne[@aprovat="si"]/nom
  • el nom dels alumnes que són delegats (Joan): //alumne[@delegat]/nom

La intersecció ens tornaria els elements que estan en les dues llistes, és a dir 

(//alumne[@aprovat="si"]/nom) intersect (//alumne[@delegat]/nom)

<nom>Joan</nom>

Amb la unió es poden unir les llistes de manera que quede una sola sense duplicats:

(//alumne[@aprovat="si"]/nom) union (//alumne[@delegat]/nom)

<nom>Albert</nom>
<nom>Joan</nom>

I amb la disjunció obtenim els noms de la primera seqüència que no apareixen en la segona: 

(//alumne[@aprovat="si"]/nom) except (//alumne[@delegat]/nom)

<nom>Albert</nom>

Nota important

En les seqüències apareixen els elements que són distints, encara que els seu contingut siga el mateix. Per exemple, el nom del professor és Joan, igual que un dels alumnes. A pesar de tenir el mateix valor, són elements diferents, nodes diferents. Així, en contra del que cabria esperar en principi, si fem la intersecció entre els noms dels alumnes i dels professors, no eixirà cap element .

(//alumne/nom) intersect (//professor/nom)

 

I si fem la unió de les seqüències anteriors, el nom Joan ens apareixarà 2 vegades, senyal que són elements diferents:

(//alumne/nom) union (//professor/nom)

<nom>Joan</nom>
<nom>Albert</nom>
<nom>Bernat</nom>
<nom>Joan</nom>