使用 xquery 分割范围

问题描述

我有一个如下的xml

<content>
<customer id="250">
<assert  PropertyType="product" PropertyValues="0009~0013" displayClass="confirmed"/>
<assert  PropertyType="product" PropertyValues="0001" displayClass="confirmed"/>
</customer>

<customer id="100">
<assert  PropertyType="product" PropertyValues="0008|0010~0012" displayClass="confirmed"/>
</customer>

<customer id="6000">
<assert  PropertyType="product" PropertyValues="0013|0036|0042|0047" displayClass="confirmed"/>
</customer>
</content>

我想访问 assert 标签中的每个 PropertyValues 属性,应该从中搜索 0011 值并返回一个布尔值
我有不同的运算符,如 ~(range) 和 | (分隔符)实际上意味着
PropertyValues="0009~0013"--> 0009 到 0013 --> 我有序列 0009 0010 0011 0013
PropertyValues="0008|0010~0012" --> 我有 0008 0010 0011 0012
PropertyValues="0013|0036|0042|0047" --> 我有 0013 0036 0042 0047

如何使用 Xquery 执行此操作
任何建议/想法将不胜感激,谢谢!

解决方法

您可以使用 tokenize 函数进行拆分,您可以使用范围运算符 to~ 的范围语法“翻译”为一个序列,最后您只需要检查结果序列是否包含您的值:

//@PropertyValues 
! 
(. || ': ' || (((tokenize(.,'\|') ! (let $tokens := tokenize(.,'~')!xs:integer(.) return $tokens[1] to $tokens[2])) ! format-integer(.,'0001')) = '0011'))

https://xqueryfiddle.liberty-development.net/94hwpi2 输出

0009~0013: true
0001: false
0008|0010~0012: true
0013|0036|0042|0047: false