Найдите положение узла с помощью xpath

85
задан Community 23 May 2017 в 10:31
поделиться

6 ответов

Попытка:

count(a/b[.='tsr']/preceding-sibling::*)+1.
92
ответ дан Wayne Burkett 24 November 2019 в 08:23
поделиться

Можно сделать это с 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>
9
ответ дан Steven Huwig 24 November 2019 в 08:23
поделиться

Проблема состоит в том, что положение узла не означает много без контекста.

следующий код даст Вам местоположение узла в его родительских дочерних узлах

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;
                }
            }
        }
    }
}
0
ответ дан Andrew Cox 24 November 2019 в 08:23
поделиться

Я делаю много материала менеджера по Идентификационным данным Novell, и XPath в том контексте выглядит немного отличающимся.

Принимают значение, которое Вы ищете, находится в строковой переменной, названной ЦЕЛЬЮ, тогда XPath был бы:

count(attr/value[.='$TARGET']/preceding-sibling::*)+1

Дополнительно было указано, что для сохранения нескольких символов пространства следующее будет работать также:

count(attr/value[.='$TARGET']/preceding::*) + 1

я также отправил более симпатичную версию этого в Прохладных Решениях Novell: Используя XPath для получения узла положения

0
ответ дан geoffc 24 November 2019 в 08:23
поделиться

В отличие от заявленного ранее, «предыдущий брат» на самом деле является используемой осью, а не «предшествующий», который делает что-то совершенно иное, он выбирает в документе все, что находится перед начальным тегом текущего узла. (см. http://www.w3schools.com/xpath/xpath_axes.asp )

3
ответ дан 24 November 2019 в 08:23
поделиться

Я понимаю, что сообщение старое .. но ..

замена звездочки на имя узла даст лучшие результаты

count(a/b[.='tsr']/preceding::a)+1.

вместо

count(a/b[.='tsr']/preceding::*)+1.
7
ответ дан 24 November 2019 в 08:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: