繁体   English   中英

XPath:找到<dd>两个之间的兄弟元素</dd><dt>也是兄弟姐妹的元素</dt>

[英]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-siblingpreceding-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM