Alguém sabe como obter a posição de um nó usando o xpath?
Digamos que eu tenha o seguinte xml:
<a>
<b>zyx</b>
<b>wvu</b>
<b>tsr</b>
<b>qpo</b>
</a>
Posso usar a seguinte consulta xpath para selecionar o terceiro <b> nó (<b> tsr </b>):
a/b[.='tsr']
O que é muito bom, mas quero retornar a posição ordinal desse nó, algo como:
a/b[.='tsr']/position()
(mas um pouco mais de trabalho!)
É mesmo possível?
editar : Esqueci de mencionar que estou usando .net 2, então é xpath 1.0!
Atualização : Acabei usando a excelente resposta de James Sulak . Para aqueles que estão interessados, aqui está minha implementação em C #:
int position = doc.SelectNodes("a/b[.='tsr']/preceding-sibling::b").Count + 1;
// Check the node actually exists
if (position > 1 || doc.SelectSingleNode("a/b[.='tsr']") != null)
{
Console.WriteLine("Found at position = {0}", position);
}
Respostas:
Experimentar:
fonte
Você pode fazer isso com XSLT, mas não tenho certeza sobre XPath direto.
fonte
Percebo que o posto é antigo .. mas ..
substituir o asterisco pelo nome do nó daria a você melhores resultados
ao invés de
fonte
Se você alguma vez atualizar para XPath 2.0, observe que ele fornece índice de função , ele resolve o problema desta forma:
Onde:
fonte
Ao contrário do que foi dito anteriormente, 'irmão-precedente' é realmente o eixo a ser usado, não 'precedente', que faz algo completamente diferente, ele seleciona tudo no documento que está antes da marca de início do nó atual. (consulte http://www.w3schools.com/xpath/xpath_axes.asp )
fonte
Apenas um recado à resposta de James Sulak.
Se você deseja levar em consideração que o nó pode não existir e deseja mantê-lo puramente XPATH, tente o seguinte que retornará 0 se o nó não existir.
fonte
O problema é que a posição do nó não significa muito sem um contexto.
O código a seguir lhe dará a localização do nó em seus nós-filhos pais
fonte
Eu faço muitas coisas do Novell Identity Manager e o XPATH, nesse contexto, parece um pouco diferente.
Suponha que o valor que você está procurando está em uma variável de string, chamada TARGET, então o XPATH seria:
Além disso, foi apontado que, para economizar alguns caracteres de espaço, o seguinte também funcionaria:
Eu também postei uma versão mais bonita disso em Cool Solutions da Novell: Usando XPATH para obter o nó de posição
fonte