[英]XPath: find <dd> sibling elements between two <dt> elements which are also siblings
我有这样的结构:
<dl>
<!-- preceded by a variable amount of <dt> and <dd> nodes -->
<dt>Venues</dt>
<dd>Madison Square Garden</dd>
<dd>Wembley</dd>
<!-- there could be more venues (in <dd>) here -->
<!-- the following <dt> doesn't necessarily have to contain text "Event" - it can be something else, too -->
<dt>Event</dt>
<dd>Grand opening</dd>
<dt>Series</dt>
<dd>Golden Virginia 49</dd>
<!-- a variable amount of <dt> and <dd> nodes continues -->
</dl>
我正在尝试在浏览器上下文中提取Venues
(即 Javascript):
我该怎么做呢?
我最接近的尝试是:
$x("//dt[text()='Venues']/following-sibling::dd")
...但这让我得到了所有<dd>
元素,而我试图在<dt>
和<dd>
元素数量可变的情况下获取两个<dt>
<dd>
之间的 <dd> 元素,我相信,我可能是错的,排除了count()
的使用。
因此,我相信要在各种dt
标签之间提取dd
标签,您将不得不使用一些略有不同的 xpath,利用following-sibling
和preceding-sibling
。
要获取包含“场地”信息的dd
标签,您可以使用以下 xpath:
//dt[contains(text(), 'Venues')]/following-sibling::dt[contains(text(), 'Event')]/preceding-sibling::dd/text()
这个 xpath 首先关注包含文本“Venues”的dt
标签。 然后它关注以下包含文本“事件”的同级dt
标记。 然后查找当前路径之前的所有dd
标签,为您提供:
但是,您不能使用此 xpath 以第一个 xpath 中完成的方式将包含文本的dt
替换为“事件”和“系列”来获取“事件”的信息。这会产生与您在何处注意到的相同问题你得到的dd
标签比你想要的多。 您现在必须使用此 xpath:
//dt[contains(text(), 'Event')]/following-sibling::dt[contains(text(), 'Series')]/preceding-sibling::dd[preceding-sibling::dt[contains(text(), 'Event')]]/text()
在这里,“Series” dt
标签的前置兄弟dd
标签必须有一个前置兄弟本身,它是一个包含文本“Event”的dt
标签。 这给你:
获取'Series'下的dd
标签(最后一个dt
标签包含在dl
父节点中,那么你可以利用你原来累的xpath)。
希望这可以帮助。 你走在正确的道路上。 有时必须进行大量试验和错误 go 才能找到您要访问的节点。
这个答案可能不适用于@TheOnin,但可能对其他人有用。 如果您在提供对current()
function 的访问的环境中使用 XPath - 例如在 XSLT - 那么您可以执行类似以下的操作,首先确保当前节点是'Venues' <dt>
:
following-sibling::dd[preceding-sibling::dt[1]=current()]
这会找到所有后面的<dd>
元素,然后将其限制为那些最接近的前一个<dt>
元素是当前元素的元素,您将其安排为 'Venues' <dt>
。
XSLT 中的一个例子是:
<xsl:template name="find-dds">
<xsl:apply-templates select="following-sibling::dd[preceding-sibling::dt[1]=current()]"/>
</xsl:template>
<xsl:template ...>
<xsl:call-templates select="//dt[contains(text(), 'Venues')]" name="find-dds"/>
</xsl:template>
尽管@TheOnin 没有确切说明他们使用哪个 Javascript 库来提供$(...)
XPath 查询接口,但我不知道有哪个库以这种方式支持current()
。 尽管如此,其他人可能会发现它很有用。
假设每个<dl>
只有一个<dt>Venues</dt>
和另一个<dt>
并且这两个<dt>
按顺序出现在<dl>
中,下面的 xpath 应该得到所有的 venue <dd>
s 不管有多少:
//dl//dd[preceding-sibling::dt[.="Venues"]][not(preceding-sibling::dt[not(.="Venues")])]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.