Re-bonjour,
En bricolant un peu avec les fonctions xpath/xquery, j'ai réussi à pondre une solution provisoire (mais peu efficace).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
xquery version "1.0";
declare function local:xposition($arg as node()) as xs:string
{
if (fn:root($arg) eq $arg)
then
{
fn:concat("/",fn:string(fn:node-name($arg)),"[1]")
}
else
{fn:concat(
local:xposition($arg/parent::node()),
"/",
fn:string(fn:node-name($arg)),
"[",
fn:string(count($arg/preceding-sibling::*)+1),
"]"
)}
};
let $doc := doc("exemple.xml") return
for $var in $doc/exemples/exemple return
<pointeur>{local:xposition($var)}</pointeur> |
La ligne
fn:string(count($arg/preceding-sibling::*)+1),
me donne la position du nœud courant par rapport à ses frères aînés. Je me suis inspiré d'un bout de code trouvé ici-même : http://www.developpez.net/forums/d27...ent/#post16679
Mais appeler plusieurs dizaines de fois "count($arg/preceding-sibling::*)" me semble largement inefficace.
En fait, il y a une fonction "position()" fournie par xpath, mais je n'arrive pas à me dépatouiller avec pour obtenir la position relative d'un nœud par rapport aux frères aînés ayant le même nom (à chaque fois, j'obtiens 1). Comment utiliser cette fonction pour obtenir le bon résultat ?
Merci.
Partager