我是XQuery的新手,坦率地说,学习曲线非常陡峭。
我的XML结构看起来像这样:
<root>
<product>
<size>500 units</size>
</product>
<product>
<size>1000 units</size>
</product>
<product>
<size>Unlimited units</size>
</product>
</root>
我需要编写一个XQuery语句,它返回 size 中的数值小于1000的所有节点。所以我不知何故需要确定这个数值(忽略任何文本)来执行我假设'le'操作。
除此之外,节点可能根本没有数字(例如“无限制单位”),在这种情况下,需要将其视为具有1000000的值。
有没有办法做到这一点?我已经尝试了 fn:replace(blah,'\ D','')的各种组合并转换为xs:int,但我似乎无法让它工作。
非常感谢任何指导。
答案 0 :(得分:3)
使用此XPath 1.0表达式:
/root/product[not(number(substring-before(size, ' ')) >= 1000)]
众所周知,XPath是XQuery的一个子集,所以上面也是一个XQuery表达式。
答案 1 :(得分:2)
这个XQuery:
for $vProduct in /root/product
let $vUnits := number(substring-before($vProduct/size,'units'))
let $vSize := if ($vUnits)
then $vUnits
else 1000000
where $vSize le 1000
return $vProduct
输出:
<product>
<size>500 units</size>
</product>
<product>
<size>1000 units</size>
</product>
答案 2 :(得分:0)
可能你应该使用fn:tokenize(subject, pattern, flags)
(这里是tokenize)函数的描述来提取你的int值。 tokenize
函数将返回一个数组,其int值位于数组的第一个位置。然后,您可以使用int值执行任何操作。
要区分给出单位的情况和“无限制单位”的情况,您可以使用“无限制单位”执行正则表达式fn:match
,或者只是在标记化之前比较字符串。如果字符串是“Unlimited units”,那么你需要处理它,而在另一种情况下,你将字符串标记为提取int值。
答案 3 :(得分:0)
为了清晰起见,重复一点
/root/product[not(substring-before(size," ") castable as xs:integer) or xs:integer(substring-before(size," ")) < 1000]
为了清晰起见,重复一点