我有以下内容我正在尝试使用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']");
有人对此有任何想法吗?
答案 0 :(得分:1)
关闭!
给定一个特定的上下文节点(这里是下载的href
属性),您希望找到包含上下文节点的td
的最老兄弟。因此,您的相对路径应首先升至td
,然后找到最老的兄弟姐妹:
parent::a/parent::td/preceding-sibling::td[last()]
或更简单(并且不假设p
和span
之间没有td
或a
之类的元素:
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表达式”将随您的环境而变化。