问题描述
<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