2009-09-03 165 views
0

我是新来使用XPath,所以我一直在愚弄XPath Evaluator,我试图找出如何返回函数的值。如何使用XPath返回函数的结果?

如果我想返回一个页面,我可以使用下面的XPath的href S中所有环节的:如果我想与href小号超过20个字符返回的所有环节

//a/@href 

我可以使用此:

//a[string-length(@href) > 20] 

我无法弄清楚什么是我该如何得到所有href S的只是长度? 我天真的假设是,这应该这样做:

//a/string-length(@href) 

但它失败(如做所有我能想到的变化)。

这怎么办?


在比特挖经过进一步我看到XPath计算器我使用硬编码XPathResult.ORDERED_NODE_SNAPSHOT_TYPE作为结果类型,当我改成ANY_TYPE(0)以下工作用于获取一条链路的长度(这是我实际需要的)

string-length((//a)[1]/@href) 

回答

1

您正在尝试查找多个字符串的长度。我可以想到两种可能的方法:

尝试将函数放在查询路径之外。现在我猜测它失败了,因为你在说“去这个节点”,并且这个节点的一部分是一个函数。试试这个:

string-length(//a/@href) 

但我仍然不认为你会得到你想要的,这是每个URL的长度。我可能是错的,但为了以防万一,您可能需要考虑首先查找所有hrefs,然后遍历结果并使用函数获取每个hrefs的长度。像

urls = //a/@href 

foreach (urls as url) { 
    if (string-length(url) > 20) 
     ....blah blah blah.... 
} 

您可能试图避免循环,但获取所有hrefs,然后使用条件可能几乎一样有效。

+0

我尝试了您的第一个建议(作为*我可以想到的所有变体的一部分*),并且它不起作用。 – Motti 2009-09-03 12:57:20

+0

根据其他答案,我认为它不会。抱歉。我不确定把查询之外的函数放在你的许多变体之中,所以我认为它可能是那些“哦,哦”类的东西之一。出于好奇,你最终使用XPath哪种语言? PHP应该很容易使用simplexml扩展来实现一个循环函数。 – Anthony 2009-09-03 13:19:12

1

XPath主要用于选择不返回标量值的节点。 XPath中标量函数的存在有助于创建谓词条件,并可用于XSLT来提供输出值。然而,大多数支持XPath的DOM实现仅支持所选节点的返回。

+0

特别是字符串长度很容易在“外部”环境中确定... – Tomalak 2009-09-03 12:01:22

0

你不能。函数用于进一步指定所需的节点(即,我希望所有tt - 具有多于3个属性的节点)。但是由于xpath查询通常会返回节点对象,因此您可以使用您在xpath中使用的语言轮询它们的属性

0

您需要遍历//a[string-length(@href) > 20]的结果,完全取决于您计划使用查询的语言。