I need to write a quite complex XSLT 1.0 query.
Given the following XML file, I need a query to get the set of authors who are in multiple reports. (for example Antonio Rossi, because he's both on report 1 and 2).
<reports>
<report id="01">
<titolo>
I venti del Nord
</titolo>
<autori>
<autore>
Antonio Rossi
</autore>
<autore>
Mario Verdi
</autore>
</autori>
<versioni>
<versione numero="1.0">
<data>
13-08-1980
</data>
<autore>
Mario Verdi
</autore>
<commento>
versione iniziale
</commento>
</versione>
<versione numero="2.0">
<data>
14-08-1981
</data>
<autore>
Antonio Rossi
</autore>
<commento>
poche modifiche
</commento>
</versione>
</versioni>
</report>
<report id="02">
<titolo>
Le pioggie del Nord
</titolo>
<autori>
<autore>
Antonio Rossi
</autore>
<autore>
Luca Bianchi
</autore>
</autori>
<versioni>
<versione numero="1.0">
<data>
13-12-1991
</data>
<autore>
Antonio Rossi
</autore>
<commento>
versione iniziale
</commento>
</versione>
<versione numero="2.0">
<data>
14-08-1992
</data>
<autore>
Antonio Rossi
</autore>
<commento>
modifiche al cap. 1
</commento>
</versione>
<versione numero="3.0">
<data>
18-08-1992
</data>
<autore>
Antonio Rossi
</autore>
<commento>
Aggiunta intro.
</commento>
</versione>
<versione numero="4.0">
<data>
13-01-1992
</data>
<autore>
Luca Bianchi
</autore>
<commento>
Modifiche sostanziali.
</commento>
</versione>
</versioni>
</report>
<report id="03">
<titolo>
Precipitazioni nevose
</titolo>
<autori>
<autore>
Fabio Verdi
</autore>
<autore>
Luca Bianchi
</autore>
</autori>
<versioni>
<versione numero="1.0">
<data>
11-01-1992
</data>
<autore>
Fabio Verdi
</autore>
<commento>
versione iniziale
</commento>
</versione>
<versione numero="2.0">
<data>
13-01-1992
</data>
<autore>
Luca Bianchi
</autore>
<commento>
Aggiornato indice
</commento>
</versione>
</versioni>
</report>
</reports>
If you can use XPath 2.0 you could use:
distinct-values(/reports/report/autori/autore[preceding::report/autori/autore = . or following::report/autori/autore = .])
With your input XML it will return:
Antonio Rossi
Luca Bianchi
This works even in XPath 1.0:
//report//autore[text()=../../following-sibling::report//autore/text()]
It selects all autore
nodes that have text content equal to any autore
node in any of the following report
nodes, too.
Or, to keep it short, even this should work if there's nothing really tricky in your real xml file:
//autore[text()=../../following-sibling::*//autore/text()]
EDIT: Working by accident. Please see the comments below.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With