В XPath 1.0 можно использовать общий (Kayessian) метод для пересечения двух множеств узлов $ns1
и $ns2
:
$ns1[count(.|$ns2) = count($ns2)]
Когда мы заменим $ns1
и $ns2
их конкретными выражениями выбора для этого конкретного случая, мы получим:
/*/comment()[1]/following-sibling::div
[count(. | /*/comment()[2]/preceding-sibling::div)
=
count(/*/comment()[2]/preceding-sibling::div)
]
Проверка на основе XSLT :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/comment()[1]/following-sibling::div
[count(. | /*/comment()[2]/preceding-sibling::div)
=
count(/*/comment()[2]/preceding-sibling::div)
]
"/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML :
<div>
<div></div>
<div></div>
<!--Comment1-->
<div>1</div>
<div>2</div>
<div>3</div>
<!--Comment2-->
<div></div>
<div></div>
<div></div>
</div>
Точные нужные узлы выбираются и выводятся :
<div>1</div>
<div>2</div>
<div>3</div>
В XPath 2.0 используется оператор intersect
:
/*/comment()[1]/following-sibling::div
intersect
/*/comment()[2]/preceding-sibling::div