sélection XPath
Le
Une Bévue

en JavaScript, j'utilise XPath pour sélectionner des noeuds :
var snapshot =
document.evaluate("/html/body/div[@id='page_arborescence']/div[@class='dir']/div[@class='dir']/div[@class='dir']/div[@class='dir']/div[@class='images']/div[@class='boxwrapper']/div[@class='box']",
document.documentElement, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null);
ça marche très bien, mais j'aimerais perfectionner cette expression.
en simplifiant, ma structure est ainsi :
<html>
<body>
<div>
<div>
<div class='box' data-path='un path' /> <!-- OK -->
[]
<div class='box' data-path='le path recherché' /> <!-- OK -->
[]
<div class='box' data-path='un autre path' /> <!-- OK -->
</div>
</div>
<div>
<div>
<div class='box' data-path='un path' /> <!-- PAS OK -->
[]
<div class='box' data-path='le path NON recherché' /> <!-- PAS OK -->
[]
<div class='box' data-path='un autre path' /> <!-- PAS OK -->
</div>
</div>
</body>
</html>
disons qu'il y a plusieurs "niches" de noeuds avec class='box' MAIS je
ne m'intéresse qu'aux noeuds qui sont dans la niche où le @data-path est
le path recherché, les autres ne m'intéressent pas.
comment n'obtenir que cette "niche" là ?
var snapshot =
document.evaluate("/html/body/div[@id='page_arborescence']/div[@class='dir']/div[@class='dir']/div[@class='dir']/div[@class='dir']/div[@class='images']/div[@class='boxwrapper']/div[@class='box']",
document.documentElement, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null);
ça marche très bien, mais j'aimerais perfectionner cette expression.
en simplifiant, ma structure est ainsi :
<html>
<body>
<div>
<div>
<div class='box' data-path='un path' /> <!-- OK -->
[]
<div class='box' data-path='le path recherché' /> <!-- OK -->
[]
<div class='box' data-path='un autre path' /> <!-- OK -->
</div>
</div>
<div>
<div>
<div class='box' data-path='un path' /> <!-- PAS OK -->
[]
<div class='box' data-path='le path NON recherché' /> <!-- PAS OK -->
[]
<div class='box' data-path='un autre path' /> <!-- PAS OK -->
</div>
</div>
</body>
</html>
disons qu'il y a plusieurs "niches" de noeuds avec class='box' MAIS je
ne m'intéresse qu'aux noeuds qui sont dans la niche où le @data-path est
le path recherché, les autres ne m'intéressent pas.
comment n'obtenir que cette "niche" là ?
En XPath ?
... no sè
mais en JS "normal" ce n'est pas si compliqué :
function getDivsDuBonPath(chemin) {
var dp = document.getElementsByTagName('*'), n = dp.length, d = [];
while(n--) if(dp[n].getAttribute('data-path')==chemin) d.push(dp[n]);
return d;
}
non ?
et puis, par exemple :
var d = getDivsDuBonPath('le path recherché'), n=d.length;
while(n--) document.body.appendChild(d[n].cloneNode(true));
Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
non ;-)
non !
en fait la solution est très simple, c'est celle que j'avais intuitée et
qui m'a été confirmée par Alain Katterlin sur fr.comp.text.xml, je cite :
ça donne donc dans mon exact cas :
var snapshot =
document.evaluate("/html/body/div[@id='page_arborescence']/div[@class='dir']/div[@class='dir']/div[@class='dir']/div[@class='dir']/div[@class='images']/div[@class='boxwrapper']/div[@class='box'
and @id='<le path recherché']/../div[@class='box']",
document.documentElement, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null);
simple comme bonjour !
chez moi, avec ton exemple, je pense que ça fonctionne
(je suis sûr et certain : j'ai testé)
Je ne comprends rien à ces histoires de remontées et redescentes !
Ça n'a rien à voir avec l'exemple de code html donné précédemment !
Là ici, et si je comprends bien, on cherche "le path recherché"
*seulement* s'il est dans une *imbrication spécifique* de divs, non ???
Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
non on cherche toutes les divs de class 'box' qui sont dans la même div
que la div de class box ayant pour id un id donné.
Comme il ne peut il y avoir qu'un seul ID de même nom, il n'est pas
difficile à trouver (qu'il lui soit ou non attribué une class 'box')
function getThatFckBoxes(leBonTruc) {
var i = document.getElementById(leBonTruc),
d = [];
i = i.parentNode;
while(i.tagName != 'div') i=i.parentNode;
i = i.getElementsByTagName('DIV');
for(var n=0, z=i.length; n<z; n++)
if(i[n].className=='box' &&
i[n].id!=leBonTruc)
d.push(i[n]);
return d;
}
Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
oui, ça doit rouler, merci !