Как я могу получить текущую позицию узла в Xpath 1.0?
Я пытаюсь /position()
, но это не работает. Я также пробовал /@position()
.
Как я могу получить текущую позицию узла в Xpath 1.0?
Я пытаюсь /position()
, но это не работает. Я также пробовал /@position()
.
Это зависит от того, что вы подразумеваете под «позицией» - функция 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)
<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
position()
должен это сделать. т.е.elementName[position()>1]
- person parakmiakos   schedule 29.08.2014