Qual é o XPath correto para escolher atributos que contêm “foo”?

StackOverflow https://stackoverflow.com/questions/103325

  •  01-07-2019
  •  | 
  •  

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>
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top