Qual é o XPath correto para escolher atributos que contêm “foo”?
Pergunta
Dada esta XML, o XPath retorna todos os elementos cujo atributo prop
contém Foo
(os três primeiros nós):
<bla>
<a prop="Foo1"/>
<a prop="Foo2"/>
<a prop="3Foo"/>
<a prop="Bar"/>
</bla>
Solução
//a[contains(@prop,'Foo')]
funciona se eu usar este XML para obter resultados de volta.
<bla>
<a prop="Foo1">a</a>
<a prop="Foo2">b</a>
<a prop="3Foo">c</a>
<a prop="Bar">a</a>
</bla>
Edit: Outra coisa a notar é que enquanto o XPath acima retornará a resposta correta para esse xml particular, se você quiser garantir que você só obter os elementos "a" no elemento "bla", você deve como os outros também usam
/bla/a[contains(@prop,'Foo')]
Este irá procurar todas elementos "a" em todo o seu documento XML, independentemente de ser aninhado em um elemento de "blah"
//a[contains(@prop,'Foo')]
Eu adicionei isso por causa de rigor e no espírito de stackoverflow. :)
Outras dicas
Este XPath lhe dará todos os nós que possuem atributos que contêm 'Foo', independentemente do nome do nó ou nome de atributo:
//attribute::*[contains(., 'Foo')]/..
Claro que, se você está mais interessado no conteúdo dos próprios atributo, e não necessariamente o seu nó pai, basta soltar o /..
//attribute::*[contains(., 'Foo')]
descendant-or-self::*[contains(@prop,'Foo')]
Ou:
/bla/a[contains(@prop,'Foo')]
Ou:
/bla/a[position() <= 3]
Dissected:
descendant-or-self::
O Axis - busca através de cada debaixo de nó e o próprio nó. Muitas vezes, é melhor dizer isso do que //. Eu encontrei algumas implementações onde // significa em qualquer lugar (decendant ou auto do nó raiz). O outro uso do eixo padrão.
* or /bla/a
O Tag -. Coringa, e / bla / a é um caminho absoluto
[contains(@prop,'Foo')] or [position() <= 3]
A condição dentro de []. @prop é uma abreviação para atributo :: suporte, como atributo é outro eixo de pesquisa. Alternativamente, você pode selecionar a primeira 3 usando a função de posição ().
John C é o mais próximo, mas XPath é case sensitive, por isso o XPath correto seria:
/bla/a[contains(@prop, 'Foo')]
Você tentou algo como:
// um [contém (@prop, "Foo")]
Eu nunca usei a função contém antes, mas suspeito que ele deve funcionar como anunciado ...
Se você também precisa corresponder ao conteúdo do próprio link, o uso de texto ():
//a[contains(@href,"/some_link")][text()="Click here"]
/ bla / a [contém (@prop, "foo")]
Para o código acima ... // * [contém (@ prop, 'foo')]
tente o seguinte:
// um [contém (@ prop, 'foo')]
que deve funcionar para todos "a" tags no documento