Попытка:
count(a/b[.='tsr']/preceding-sibling::*)+1.
Можно сделать это с XSLT, но я не уверен в прямом XPath.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"
omit-xml-declaration="yes"/>
<xsl:template match="a/*[text()='tsr']">
<xsl:number value-of="position()"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
Проблема состоит в том, что положение узла не означает много без контекста.
следующий код даст Вам местоположение узла в его родительских дочерних узлах
using System;
using System.Xml;
public class XpathFinder
{
public static void Main(string[] args)
{
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(args[0]);
foreach ( XmlNode xn in xmldoc.SelectNodes(args[1]) )
{
for (int i = 0; i < xn.ParentNode.ChildNodes.Count; i++)
{
if ( xn.ParentNode.ChildNodes[i].Equals( xn ) )
{
Console.Out.WriteLine( i );
break;
}
}
}
}
}
Я делаю много материала менеджера по Идентификационным данным Novell, и XPath в том контексте выглядит немного отличающимся.
Принимают значение, которое Вы ищете, находится в строковой переменной, названной ЦЕЛЬЮ, тогда XPath был бы:
count(attr/value[.='$TARGET']/preceding-sibling::*)+1
Дополнительно было указано, что для сохранения нескольких символов пространства следующее будет работать также:
count(attr/value[.='$TARGET']/preceding::*) + 1
я также отправил более симпатичную версию этого в Прохладных Решениях Novell: Используя XPath для получения узла положения
В отличие от заявленного ранее, «предыдущий брат» на самом деле является используемой осью, а не «предшествующий», который делает что-то совершенно иное, он выбирает в документе все, что находится перед начальным тегом текущего узла. (см. http://www.w3schools.com/xpath/xpath_axes.asp )
Я понимаю, что сообщение старое .. но ..
замена звездочки на имя узла даст лучшие результаты
count(a/b[.='tsr']/preceding::a)+1.
вместо
count(a/b[.='tsr']/preceding::*)+1.