使用(对于第一个想要的结果):
($first)[1] | ($last)[1]
|
($first)[1]/following::node()
[count(.|($last)[1]/preceding::node()) = count(($last)[1]/preceding::node())]
您需要替换$first
的地方:
//div[@id="layer22"]/b/span[@style="background-color: #FFFF99"]
并替换$last
为:
//div[@id="layer22"]/a[contains(.,"Join")]
要获得第 k 个结果,请($first)[1]
用($first)[{k}]
和($last)[1]
替换最终表达式($last)[{k}]
,其中{k}
应替换为数字k。
该技术直接遵循著名的 XPath 1.0 中集合交集的 Kayessian 公式:
$ns1[count(.|$ns2) = count($ns2)]
它选择两个节点集$ns1
和的交集$ns2
。
下面是一个简单示例的 XSLT 验证:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>03</num>
<num>07</num>
<num>10</num>
</nums>
这种转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="v1" select=
"(//num[. = 3])[1]/following-sibling::*"/>
<xsl:variable name="v2" select=
"(//num[. = 7])[1]/preceding-sibling::*"/>
<xsl:template match="/">
<xsl:copy-of select=
"$v1[count(.|$v2) = count($v2)]"/>
</xsl:template>
</xsl:stylesheet>
应用 XPath 表达式并将所选节点复制到输出:
<num>04</num>
<num>05</num>
<num>06</num>