Звучит так, как будто вы хотите игнорировать w: p элементы, которые вложены в другие w: p элементы.
Если это так, то вам нужно изменить оператор так, чтобы он включал только элемент w: p , у которого нет элемента w: p в качестве предка.
<xsl:value-of select="count($currentNode/preceding::w:p[not(ancestor::w:p)])"/>
Это должно вернуть значение 7, а не 8. Я предполагаю, что текущий узел para8 здесь, кстати.
Итак, предположим, что следующий документ XML
<w:document xmlns:w="w">
<w:body>
<w:p>
<w:r>
<w:pict>
<v:shape xmlns:v="v">
<v:textbox>
<w:txbxContent>
<w:p><!-- My Ignore case -->
<w:r>
<w:t>paragraph1 </w:t>
</w:r>
</w:p>
</w:txbxContent>
</v:textbox>
</v:shape>
</w:pict>
</w:r>
<w:r>
<w:t>Normal Paragraph1</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>paragraph2 </w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>paragraph3 </w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>paragraph4 </w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>paragraph5 </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>
</w:document>
Если вы используете следующий XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:w="w">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="currentNode" select="//w:p[w:r/w:t = 'para8']" />
Old: <xsl:value-of select="count($currentNode/preceding::w:p)"/>
-----
New: <xsl:value-of select="count($currentNode/preceding::w:p[not(ancestor::w:p)])"/>
</xsl:template>
</xsl:stylesheet>
Затем возвращается следующее:
Old: 8
-----
New: 7