此XPath 1.0表达式选择第一个蓝色 tr
元素的“块”:
(tr[@class='blue'][1]/following-sibling::tr)
[count(. | /*/tr[@class='blue'][1]
/following-sibling::tr
[not(@class='blue')][1]
/preceding-sibling::*
)
=
count(/*/tr[@class='blue'][1]
/following-sibling::tr
[not(@class='blue')][1]
/preceding-sibling::*
)
]
说明:
使用众所周知的Kayessian公式来进行节点集交集计算:
$ns1[count(.|$ns2) = count($ns2)]
这个XPath表达式选择属于节点集
$ns1
和节点集
$ns2
的节点。
在这种情况下,我们只需用适当的具体XPath表达式替换
$ns1
和
$ns2
-- 一个是第一个蓝色
tr
及其后续兄弟节点,另一个是第一个蓝色
tr
之后的第一个非蓝色
tr
及其前面的所有兄弟节点。这两个节点集的交集正是所需的第一个蓝色
tr
块。
XSLT - 基于验证:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy-of select=
"(/*/tr[@class='blue'][1] | /*/tr[@class='blue'][1]/following-sibling::tr)
[count(. | /*/tr[@class='blue'][1]
/following-sibling::tr
[not(@class='blue')][1]
/preceding-sibling::*
)
=
count(/*/tr[@class='blue'][1]
/following-sibling::tr
[not(@class='blue')][1]
/preceding-sibling::*
)
]
"/>
</xsl:template>
</xsl:stylesheet>
当将此转换应用于以下 XML 文档时:
<t>
<tr class='red'></tr>
<tr class='red'></tr>
<tr class='red'></tr>
<tr class='red'></tr>
<tr class='blue'></tr>
<tr class='blue'></tr>
<tr class='red'></tr>
<tr class='red'></tr>
<tr class='blue'></tr>
</t>
XPath表达式会被评估并将所选节点复制到输出中:
<tr class="blue"/>
<tr class="blue"/>