Текущая позиция узла Xpath 1.0

Как я могу получить текущую позицию узла в Xpath 1.0?

Я пытаюсь /position(), но это не работает. Я также пробовал /@position().


person D. Caan    schedule 29.08.2014    source источник
comment
Просто position() должен это сделать. т.е. elementName[position()>1]   -  person parakmiakos    schedule 29.08.2014
comment
@parakmiakos ОП хочет получить позицию, а не проверять ее.   -  person alecxe    schedule 29.08.2014
comment
Определите, что вы подразумеваете под положением узла.   -  person Michael Kay    schedule 29.08.2014


Ответы (2)


Это зависит от того, что вы подразумеваете под «позицией» - функция position() не обязательно имеет какое-либо отношение к местоположению узла в XML-дереве, к которому он принадлежит, она просто означает положение текущего контекстного узла в «текущем списке узлов» ( и значение этого зависит от основного языка, который оценивает XPaths, в XSLT, например, это означает список узлов, select-ed ближайшим apply-templates или for-each).

Если у вас есть элемент с именем foo и вы хотите узнать, является ли он первым, вторым и т. д. foo в своем родительском элементе (т. е. число N, которое вам нужно будет вернуть к нему как ../foo[N]), вы можете сделать это, подсчитав его предыдущие братья и сестры с таким же именем

count(preceding-sibling::foo) + 1

Однако для этого вам нужно знать имя заранее, когда вы создаете выражение XPath - чистый XPath 1.0 не позволяет вам подсчитывать количество «предшествующих братьев и сестер, которые имеют то же имя, что и текущий узел».

Некоторые базовые языки могут предоставлять переменную или функцию, которая позволяет это сделать — снова используя XSLT в качестве примера, вы можете использовать функцию current() для ссылки на текущий узел контекста из любого места в выражении, включая внутренние предикаты. В XPath 2.0 вы можете сделать это с помощью

for $cur in . return (count(preceding-sibling::*[name() = name($cur)]) + 1)
person Ian Roberts    schedule 29.08.2014

<xsl:template name="node-index-of">
    <xsl:param name="nodes" />
    <xsl:param name="node" />
    <xsl:param name="index" />
    <xsl:choose>
        <xsl:when test="$nodes[position()=$index]=$node">
            <xsl:value-of select="$index"/>    
        </xsl:when>
        <xsl:when test="$index=count($nodes)">
            <xsl:value-of select="$index"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:call-template name="node-index-of">
                <xsl:with-param name="nodes" select="$nodes" />
                <xsl:with-param name="node" select="$node" />
                <xsl:with-param name="index">
                    <xsl:value-of select="$index+1"/>
                </xsl:with-param>
            </xsl:call-template>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

$индекс начинается с 1

person Igor Ilyin    schedule 03.04.2016