如何找到链接的前一个兄弟

时间:2012-08-23 21:52:26

标签: xpath

我有以下内容我正在尝试使用xpath进行分析

<table>
 <tr>

  <td>Name</td>
  <td>Info</td>
  <td><a href = "file1">Download</a></td>

</tr>

<tr>
 <td>Name2</td>
 <td>Info</td>
 <td><a href = "file2">Download</a></td>

</tr>

....

<tr>
..
</tr>

</table>

我有以下xpath来抓取下载链接

$xpath->query("//a[text()='Download']/@href");

我想弄清楚的是要发送的查询以获取每个下载的名称。

该页面根本没有div id标记,只有普通表,tr,td标记。

我尝试了类似

的内容
$xpath->query("//preceding-sibling::a[text()='Download']");

有人对此有任何想法吗?

1 个答案:

答案 0 :(得分:1)

关闭!

给定一个特定的上下文节点(这里是下载的href属性),您希望找到包含上下文节点的td的最老兄弟。因此,您的相对路径应首先升至td,然后找到最老的兄弟姐妹:

parent::a/parent::td/preceding-sibling::td[last()]

或更简单(并且不假设pspan之间没有tda之类的元素:

ancestor::td[1]/preceding-sibling::td[last()]

有些用户发现preceding-sibling轴上节点的反向编号会让人感到困惑,所以说你真正想要的是包含{{1}的最小子节点的第一个td孩子可能会更简单一些。 }:

tr

如果您需要一次性获取所有下载链接它们的文本标签,那么您的操作方式取决于您使用XPath的上下文。例如,在XSLT中,您可以编写:

ancestor::tr[1]/child::td[1]

然后在相应的模板中获取标签:

<xsl:apply-templates select="//a[text()='Download']/@href"/>

在其他主语言中,您需要做类似的事情。关键问题是您必须遍历与<xsl:template match="a/@href"> <xsl:value-of select="string(ancestor::tr[1]/td[1])"/> : <xsl:value-of select="."/> </xsl:template> 表达式匹配的节点,然后对于每个节点,您需要在文档中移回以获取标签。 How to say“根据第一个XPath表达式中的当前节点评估第二个XPath表达式”将随您的环境而变化。