为何提取XML数值元素时XPath的*[number()]无结果,加逻辑运算符才生效?
问题原因解析
1. 单独使用//*[number()]无结果的核心原因
XPath里的number()函数作用于元素节点时,会先取该节点的字符串值(即所有后代文本节点的内容拼接在一起),再尝试转成数字。如果你的XML里的数值元素满足以下任一情况,都会导致number()的返回值在布尔上下文里为false,从而筛选不到节点:
- 元素包含子元素,其字符串值混杂了非数字内容,转成数字后是
NaN,而NaN在布尔判断中视为false; - 元素文本是
0,number()返回0,而0在布尔上下文里同样被视为false。
2. 添加and not(descendant::*)能获取非零数值元素的原因
not(descendant::*)筛选的是没有任何子元素的叶子节点,这类节点的字符串值就是自身的直接文本内容。如果文本是纯非零数字,number()会返回对应的正/负数值,这些数值在布尔判断中是true,因此能精准匹配到非零的数值叶子节点。
3. 添加or format-number(text(),0)='0'能获取全部数值元素的原因
format-number(text(),0)会把元素的直接文本子节点内容格式化为整数格式的字符串,当文本是0(或可转成0的数值)时,结果就是'0'——这个条件专门补上了number()无法匹配的数值0的情况。结合前面的number()(匹配非零数值节点),就覆盖了所有数值类型的元素(包括0)。
内容的提问来源于stack exchange,提问作者Jonny Hotchkiss
相关产品推荐
相关产品推荐

