XPath avec élément facultatif dans la hiérarchie
Que dans ce Un Débordement de pile répondre imaginez que vous avez besoin pour choisir une table, et puis toutes les lignes de. En raison de la permissivité de l'HTML, les trois suivantes sont légales balisage:
<table id="foo"><tr>...</tr></table>
<table id="foo"><tbody><tr>...</tr></tbody></table>
<table id="foo"><tr>...</tr><tbody><tr>...</tr></tbody></table>
Vous êtes inquiet au sujet de tables imbriquées dans les tableaux, et ainsi ne voulez pas utiliser un XPath comme
table[@id="foo"]//tr
.
Si vous pouviez préciser votre choix de XPath comme une expression régulière, il pourrait ressembler à quelque chose comme:
table[@id="foo"](/tbody)?/tr
En général, comment pouvez-vous spécifier une expression XPath qui permet à un élément facultatif dans la hiérarchie d'un sélecteur?
Pour être clair, je ne suis pas d'essayer de résoudre un problème réel ou sélectionnez un élément spécifique d'un document spécifique. Je vous demande de techniques permettant de résoudre une classe de problèmes.
- Oh, et pour des raisons de simplicité et de généralité, je suis ignorant la
thead
ettfoot
éléments juridiques dans le code HTML.
Vous devez vous connecter pour publier un commentaire.
Je ne vois pas pourquoi vous ne pouvez pas utiliser cette:
Si vous voulez une expression sans nœud de l'ensemble de l'union:
descendant
axe) est de moins en moins efficaceUtilisation:
Sélectionnez tout
tr
élément qui est un enfant de touttable
qui a unid
attribut "foo", ou touttr
élément qui est un enfant d'untbody
qui est un enfant touttable
.div[@id="contents]//table[@class="comments"](/tbody)?/tr/[td//text()[contains(., 'targetString')]]
il devient très non- SEC pour dupliquer l'expression autour d'une même variation.//table[@id="foo"]/(tr|(tbody|thead|tfoot)/tr)
Dans XPath 2.0, l'étape facultative peut être exprimée comme
(tbody|.)
.XPathTester.com démo
La pipe (
|
) indique union (de deux node-sets), le dot (.
) indique l'identité de l'étape (de retour juste ce que l'étape précédente n').Ce peut être étendue pour inclure plus d'éléments facultatifs à la fois:
(tbody|.)
ressemble à un valideFilterExpr
jeton (PrimaryExpr
→'(' Expr ')'
→OrExpr
→AndExpr
→EqualityExpr
→RelationalExpr
→AdditiveExpr
→MultiplicativeExpr
→UnaryExpr
→UnionExpr
).