XPath:在节点集上使用字符串函数吗?

时间:2019-05-21 13:42:07

标签: xml xpath

我想知道是否可以在节点集上使用字符串函数-特别是XPath 1.0中的'substring()'函数。

我要从中抓取详细信息的页面具有5个URL的节点集,这些URL返回以下XPath位置路径:

//div[@class='titles cf']/a[not(contains(div,'Sold'))]/@href

不幸的是,URL的格式为“ //www.example.com”-我需要使用“ www.example.com”格式(不带斜杠)。我尝试过:

substring(//div[@class='example example-1']/a[not(contains(div,'Sold'))]/@href, 3)

但是,这仅返回1个结果。我需要所有5个没有前导斜线的返回。我的猜测是您不能在节点集上使用这种字符串函数,但是希望有人可以对此有所帮助,请帮助我达到我想要的结果吗?

如果有其他方法可以达到相同的结果,那么我也很高兴。

谢谢

1 个答案:

答案 0 :(得分:0)

无法使用纯XPath 1中的函数来处理任意列表或节点集的每一项,因此您将需要使用XPath的宿主语言来分别处理不同的节点并调用宿主语言中每个项目的子字符串功能(例如XSLT <xsl:for-each select="/div[@class='titles cf']/a[not(contains(div,'Sold'))]/@href"><xsl:value-of select="substring(., 3)"/></xsl:for-each>)。

在XPath 2和更高版本中,您可以使用函数调用或作为最后一步,例如/div[@class='titles cf']/a[not(contains(div,'Sold'))]/@href/substring(., 3)或使用for .. return表达式,例如for $href in /div[@class='titles cf']/a[not(contains(div,'Sold'))]/@href return substring($href, 3),但在纯XPath 1中没有这样的选项。

当然,如果您知道自己有五个项目,那么根据使用XPath(宿主语言或工具)的方式,您可能可以使用五个路径表达式,例如substring((/div[@class='titles cf']/a[not(contains(div,'Sold'))]/@href)[1], 3)substring((/div[@class='titles cf']/a[not(contains(div,'Sold'))]/@href)[2], 3)