Используйте
count($vtheNode/preceding::w:p)
, где $vtheNode
- ваш узел.
XSLT (как 1.0, так и 2.0) решение :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:w="w:w">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vtheNode" select=
"/w:body/w:tbl/w:tr/w:tc[last()]"/>
<xsl:template match="/">
<xsl:value-of select="count($vtheNode/preceding::w:p)"/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML (с пространством имен, определенным, чтобы сделать его правильно сформированным):
<w:body xmlns:w="w:w">
<w:p>
<w:r>
<w:t>para1</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>para2</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>para3</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>para4</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>para5</w:t>
</w:r>
</w:p>
<w:tbl>
<w:tr>
<w:tc>
<w:p>
<w:r>
<w:t>para6</w:t>
</w:r>
</w:p>
</w:tc>
<w:tc>
<w:p>
<w:r>
<w:t>para7</w:t>
</w:r>
</w:p>
</w:tc>
<!-- Assume This is my Current Node -->
<w:tc>
<w:p>
<w:r>
<w:t>para8</w:t>
</w:r>
</w:p>
</w:tc>
</w:tr>
</w:tbl>
</w:body>
желаемый, правильный результат получается :
7
Примечание. 1025 *: поскольку оси preceding::
и ancestor::
не перекрываются, это более общее решение, которое не зависит от структуры документа и учитывает возможность того, что некоторые из желаемое количество узлов может быть предками:
count($vtheNode/preceding::w:p | ($vtheNode/ancestor::w:p)