【发布时间】:2012-04-27 19:43:47
【问题描述】:
很简单,有一个 HTML 文件,还有一个 div 变量 id 像这样
<div id="abc_1"><div>
id 的整数部分是可变的,所以它可以是 abc_892、abc_553 ...等
什么是最好的查询?
【问题讨论】:
-
参考:Using regex to filter attributes in xpath with php(2011 年 7 月)
很简单,有一个 HTML 文件,还有一个 div 变量 id 像这样
<div id="abc_1"><div>
id 的整数部分是可变的,所以它可以是 abc_892、abc_553 ...等
什么是最好的查询?
【问题讨论】:
//div[starts-with(@id, "abc_")]
【讨论】:
当前接受的答案选择了以下不需要的元素:
<div id="abc_xyz"/>
但只有这样的div元素必须被接受,其id不仅以"abc_"开头,而且_后面的子字符串是一个整数的表示。
使用这个 XPath 表达式:
//div
[@id[starts-with(., 'abc_')
and
floor(substring-after(.,'_'))
=
number(substring-after(.,'_'))
]
]
这将选择任何具有id 属性的div 元素,其字符串值以字符串"abc_" 开头,并且- 之后的子字符串是整数的有效表示。
解释:
这里我们使用 XPath 1.0 中的这个 XPath 表达式:
floor($x) = number($x)
当$x 是一个整数时,计算为true()。
这很容易证明:
如果$x 是整数,则根据定义,上述表达式的计算结果为true()。
$x 是一个数字(number($x) 不是NaN),根据定义,等于整数floor($x) 的数字$x 是一个整数。
替代解决方案:
//div
[@id[starts-with(., 'abc_')
and
'abc_' = translate(., '0123456789', '')
]
]
【讨论】:
null = null 总是假的)?谢谢。
//div[@id[translate(.,'0123456789','') = 'abc_']] 会不会更快?
floor($x) = $x,因为它更具可读性和可理解性,并且可以很好地转化为“类型检查”。