Я полагаю, что вы хотите игнорировать узлы w: p , если соответствующий атрибут w: val больше w: val элемент предыдущего w: p (где он существует).
В терминах XPath, где ...
number(substring-after(w:ppr/w:pstyle/@w:val, 'Heading'))
>= number(substring-after(preceding-sibling::w:p[1]/w:ppr/w:pstyle/@w:val, 'Heading'))
Вот полный XSLT, которыйявляется преобразованием идентичности, с дополнительным регистром, чтобы соответствовать таким w: p узлам и игнорировать их:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="w:p
[
preceding-sibling::w:p[1]
and
number(substring-after(w:ppr/w:pstyle/@w:val, 'Heading'))
>= number(substring-after(preceding-sibling::w:p[1]/w:ppr/w:pstyle/@w:val, 'Heading'))
]">
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="comment()" />
</xsl:stylesheet>
При применении к входной выборке генерируется следующий вывод:*
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:body>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1"/>
</w:ppr>
<w:r>
<w:t>Para1</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1"/>
</w:ppr>
<w:r>
<w:t>Para5</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading2"/>
</w:ppr>
<w:r>
<w:t>Para8</w:t>
</w:r>
</w:p>
<w:p>
<w:ppr>
<w:pstyle w:val="Heading1"/>
</w:ppr>
<w:r>
<w:t>Para10</w:t>
</w:r>
</w:p>
</w:body>
</w:document>