2009-05-14 3 views
13

Je connais la valeur partielle d'un attribut dans un document, mais pas le tout. Y a-t-il un personnage que je puisse utiliser pour représenter une valeur? Par exemple, la valeur d'une étiquette pour une entrée est "A. Choix 1". Je sais qu'il dit "Choix 1", mais pas s'il dira "A." ou "B." avant le "Choix 1". Voici le code HTML pertinent. Il existe d'autres attributs pour l'entrée et l'étiquette, mais ils ne sont pas les mêmes à chaque fois que la page est rendue, donc je ne peux pas les utiliser comme références:XPath partielle de l'attribut connu

<tr> 
<td><input type="checkbox" /><label>A. Choice 1</label></td> 
</tr><tr> 
    <td><input type="checkbox" /><label>B. Choice 2</label></td> 
</tr><tr> 
<td><input type="checkbox" /><label>C. Choice 3</label></td> 
</tr><tr> 
    <td><input type="checkbox" /><label>D. Choice 4</label></td> 
</tr> 

C'est l'expression XPath J'utilise pour sélectionner l'entrée à côté de l'étiquette avec la valeur de « choix 1 », à l'exception que l'A est en face de celui-ci dans le code HTML:

//td[label="Choice 1"]/input 

Je ne sais pas si l'un dans le code HTML sera A, B ou C, etc. Mais je sais que l'entrée correcte aura toujours le texte du Choix 1 à côté de lui. Comment puis-je dire pour le sélectionner si l'étiquette contient Choix 1, par opposition à étant égal à choix 1?

Répondre

27

Votre expression XPath devrait ressembler à ceci:

//td[contains(@label, 'Choice 1')]/input 

Vous sélectionnez tous td éléments qui ont une étiquette qui contient Choice 1 puis vous sélectionnez les éléments à l'intérieur input ces td éléments.

EDIT: Le commentaire de Tomalak suggère correctement une amélioration pour éviter une correspondance avec 'Choice 11' (ou 'Choice 12345', ...).

+0

génial, merci. C'est exactement ce dont j'avais besoin. – avaleske

+0

Aussi utile pour moi, merci :) –

+5

Non, ça devrait ressembler à '// td [contains (concat ('', label, ''), 'Choice 1')]/input' ou ça correspond' Choix 11 '. – Tomalak

4

Trouvé la solution de Ronald tout en essayant de trouver un moyen de tester si un noeud a un attribut 'align' qui n'est pas vide OU un attribut 'style' qui contient la valeur de texte 'text-align'. Ce sont les 'nœuds' en question:

<node> 
    <p>This is left-aligned.</p> 
    <div align="left" >This is aligned LEFT using HTML attribute.</div> 
    <p style="text-align: center;" >This is centered using CSS style attribute.</p> 
    <div align="center" >This is CENTERED.</div> 
    <p style="text-align: right;" >This is right-aligned.</p> 
</this> 

Cette expression XPath a travaillé - grâce à la réponse de Ronald qui m'a orienté dans la bonne direction:

//*[contains(@style, 'align') or @align!='']