使用 xquery 拆分范围
splitting a range using 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>
我想获取断言标记中的每个 PropertyValues 属性,应该从中搜索 0011 值并 return 一个布尔值
我有不同的运算符,如 ~(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
我有一个 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>
我想获取断言标记中的每个 PropertyValues 属性,应该从中搜索 0011 值并 return 一个布尔值
我有不同的运算符,如 ~(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