更高效——不需要联合:
//div/span
[@class='b'
or
@class='a'
and
not(parent::*[span[@class='b']])
]
作为两个绝对“//
表达式”的并集的表达式(如下所示),通常执行两个完整的文档树遍历,然后联合操作按文档顺序执行重复数据删除和排序——所有这些都可能比单个操作效率低得多树遍历,除非 XPath 处理器具有智能优化器。
这种低效表达的一个例子:
//div/span[@class='b'] | //div[not(./span[@class='b'])]/span[@class='a']
基于 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="/">
<xsl:copy-of select=
"//div/span
[@class='b'
or
@class='a'
and
not(parent::*[span[@class='b']])
]"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<div class="info">
<a href="/s/xyz.html" class="title">title</a>
<span class="a">123</span>
<span class="b">456</span>
<span class="c">789</span>
</div>
计算 Xpath 表达式,并将选定的元素(在本例中只有一个)复制到输出:
<span class="b">456</span>
当相同的转换应用于不同的 XML 文档时,其中没有class='b'
:
<div class="info">
<a href="/s/xyz.html" class="title">title</a>
<span class="a">123</span>
<span class="x">456</span>
<span class="c">789</span>
</div>
评估相同的 XPath 表达式并将正确选择的元素复制到输出:
<span class="a">123</span>