XQuery:从字符串中提取数字以供比较使用

时间:2011-01-25 13:33:21

标签: parsing xpath numbers xquery

我是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,但我似乎无法让它工作。

非常感谢任何指导。

4 个答案:

答案 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]

为了清晰起见,重复一点