0

我有以下我正在尝试使用 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 标记,只有普通的 table、tr、td 标签。

我尝试过类似的东西

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

有人对此有任何想法吗?

4

1 回答 1

1

关!

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

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

或更简单地说(并且不假设在和之间没有类似pspan干预的元素):tda

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

一些用户发现preceding-sibling轴上节点的反向编号令人困惑,因此说您真正想要的是td最小包含的第一个孩子可能会感觉更简单tr

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

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

<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> 

在其他宿主语言中,您会想要做类似的事情。关键问题是您必须遍历与表达式匹配的节点href,然后对于每个节点,您需要在文档中移回以获取标签。您如何说“根据第一个 XPath 表达式中的当前节点评估第二个 XPath 表达式”会因您的环境而异。

于 2012-08-23T22:11:50.107 回答