XPath: selecione o nó de texto

150

Tendo o seguinte XML:

<node>Text1<subnode/>text2</node>

Como seleciono o primeiro ou o segundo nó de texto via XPath?

Algo assim:

/node/text()[2]

é claro que não funciona porque é o resultado mesclado de todos os textos dentro do nó.

núcleo
fonte
11
Você escreveu: /node/text()[2][...] não funciona porque é o resultado mesclado de todo texto dentro do nó. Isso está errado: significa o segundo filho do nó noderaiz do elemento raiz . O valor da sequência (concatenação dos nós de texto descendentes) seria #string(/node)
Você quer dizer que a consulta Xpath deve funcionar? Bem, acho que tenho outro problema em outro lugar. ;) Obrigado!
kernel
Boa pergunta, +1. Consulte minha resposta para obter explicações e várias expressões XPath que selecionam todo ou um filho específico do nó de texto do elemento superior.
Dimitre Novatchev

Respostas:

183

Tendo o seguinte XML:

<node>Text1<subnode/>text2</node> 

Como seleciono o primeiro ou o segundo nó de texto via XPath?

Use :

/node/text()

Isso seleciona todos os filhos do nó de texto do elemento superior (chamado "nó") do documento XML.

/node/text()[1]

Isso seleciona o primeiro filho do nó de texto do elemento superior (chamado "nó") do documento XML.

/node/text()[2]

Isso seleciona o segundo filho do nó de texto do elemento superior (chamado "nó") do documento XML.

/node/text()[someInteger]

Isso seleciona o filho do nó superior do elemento superior (chamado "nó") do documento XML. É equivalente à seguinte expressão XPath:

/node/text()[position() = someInteger]
Dimitre Novatchev
fonte
@NaftuliTzviKay: isso significa que o Chrome está quebrado. /node[2]não deve selecionar nenhum nó se o documento XML de origem estiver bem formado. Por definição, em um documento XML bem formado, existe apenas um (único) elemento superior - também conhecido comodocument-element
Dimitre Novatchev
1
Isso funciona em PHP? Estou tentando fazer um loop através de apenas nós de texto, mesmo aqueles entre um conjunto de tags. O problema é que está quebrando o conteúdo de vários nós de texto, independentemente das tags. Usando de //*[text()]qualquer maneira. /html/text()não funciona.
Aaron Gillion
2
@AaronGillion, Sim, o AFAIK PHP tem uma avaliação XPath 1.0 funcionando corretamente. Observe que /html/text()não seleciona todos os nós de texto no documento - apenas os nós de texto filhos (não descendentes) do htmlelemento superior . Você provavelmente quer /html//text() . Geralmente, é necessário algum conhecimento e entendimento do XPath para construir expressões XPath.
Dimitre Novatchev
Obrigado. Eu descobri o truque de barra dupla há pouco!
Aaron Gillion
@AaronGillion, de nada. Você pode aprender o básico do XPath 1.0 e 2.0 no módulo 2 deste curso de treinamento on-line: pluralsight.com/courses/xslt-foundations-part1
Dimitre Novatchev
29

seu xpath deve funcionar. Testei o seu xpath e o meu na implementação do MarkLogic e do Zorba Xquery / Xpath.

Ambos devem funcionar.

/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2


/node/text()[1] - should return Text1
/node/text()[2] - should return text2
kadalamittai
fonte