javascript - XPATH 中第 n 个前面的元素(兄弟或祖先)

标签 javascript html xpath

假设我的标记是:

<html>
<body>

<div>
 <div>blbaba</div>
 <p>a</p>
 <p>b</p>
 <p>c</p>
 <p>d</p>
 <div id="a1">blbaba</div>
 <p>e</p>
 <p>f</p>
 <p>g</p>
 <p>h</p> 
 <div>blbaba</div>
</div>

</body>
</html>

如何选择相对于特定元素的元素,即 n之前的节点(在文档中可以是之前的父节点或兄弟节点)。

例子:

我想选择第二个<p> div 之前的元素 @id ="a1" , 所以我期望的元素是 <p>c</p>

最佳答案

preceding::ancestor::不相交,因此在一般情况下您将无法选择想要的元素,除非您使用这两个轴选择的元素。

引用 W3C XPath 1.0 Specification :

•the preceding axis contains all nodes in the same document as the context node that are before the context node in document order, excluding any ancestors and excluding attribute nodes and namespace nodes

使用:

(//p[@id='a1']/ancestor::div | //p[@id='a1']/preceding::div) 
                                                        [last() -$n +1]

这选择了第 n 个 div属于前面和祖先的并集的元素(按文档顺序向后)div p 的元素id 的元素属性的值是字符串“a1”。这里我们假设 id属性唯一标识它所属的元素。

例如,如果我们有这个 XML 文档(我让这个例子更真实,因为 div 可以嵌套,而 p 不能):

<html>
    <body>
       <div>
          <p>a</p>
          <p>b</p>
          <p>c</p>
          <div id="y">
             <p>d</p>
             <div>blbaba</div>
             <p id="a1">e</p>
             <p>f</p>
             <p>g</p>
             <p>h</p>
             <div>blbaba</div>
          </div>
       </div>
    </body>
</html>

我们想得到第二个div在(按文档顺序)p 之前与 id "a1 ", 然后这个 XPath 表达式选择想要的 div元素:

(//p[@id='a1']/ancestor::div | //p[@id='a1']/preceding::div)
                                                        [last() -1]

这个简短的 XSLT 转换证明上面的 XPath 表达式选择了想要的 div。元素(通过评估 XPath 表达式并复制整个选定的 div 元素):

<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=
     "(//p[@id='a1']/ancestor::div | //p[@id='a1']/preceding::div)
                                                        [last() -1]"/>
  </xsl:template>
</xsl:stylesheet>

当上述转换应用于上述源 XML 文档时,它会选择想要的 div元素并将其复制到输出:

<div id="y">
   <p>d</p>
   <div>blbaba</div>
   <p id="a1">e</p>
   <p>f</p>
   <p>g</p>
   <p>h</p>
   <div>blbaba</div>
</div>

关于javascript - XPATH 中第 n 个前面的元素(兄弟或祖先),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30393538/

相关文章:

loops - 使用HtmlAgilityPack选择SelectedNodes中的每个节点

javascript - document.querySelectorAll(多个数据集);

javascript - 内容脚本(页面模块)和弹出窗口(面板)之间的通信

ruby-on-rails-3 - 如何使 HTML5 iframe seamless 属性在我的 Rails 3 应用程序中工作?

html - 使用 slider 调整传单 map 上的亮度

javascript - 滚动时锁定窗口顶部的对象

javascript - 验证函数后返回 'true'

javascript - 每个堆叠列的 Highcharts 数据标签

java - 使用 XPath 从 XML 获取元素值

python : lxml xpath get two different classes