使用:
//dt[. = 'cat1']
/following-sibling::dd
[count(.| //dt[. = 'cat2']/preceding-sibling::dd)
=
count(//dt[. = 'cat2']/preceding-sibling::dd)
]
如果每个都选择一个元素,上面的表达式就会准确地选择想要的两个//dt[. = 'cat1']
元素。//dt[. = 'cat2']
dd
基于 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=
"//dt[. = 'cat1']
/following-sibling::dd
[count(.| //dt[. = 'cat2']/preceding-sibling::dd)
=
count(//dt[. = 'cat2']/preceding-sibling::dd)
]
"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时(修改了最后两个dd
s 的值,因此我们确定选择了所需的元素):
<dl class="ismSummary ismHomeSummary">
<dt>cat1</dt>
<dd>value1</dd>
<dd>value2</dd>
<dt>cat2</dt>
<dd>value3</dd>
<dd>value4</dd>
</dl>
计算 XPath 表达式并将其选择的节点复制到输出:
<dd>value1</dd>
<dd>value2</dd>
说明:
在这里,我们在 XPath 1.0中使用Kayessian 方法进行节点集交集:
两个节点集的交集:$ns1
和$ns2
是:
$ns1[count(.|$ns2) = count($ns2)]
在我们的例子中,我们替换$ns1
为:
//dt[. = 'cat1']/following-sibling::dd
我们$ns2
用:
//dt[. = 'cat2']/preceding-sibling::dd