2

我的电子名片有一个 CATEGORIES 属性,它有一个逗号分隔的值列表。我想要的是在这个逗号分隔的列表中的某处获取所有具有传递值的电子名片。

我正在尝试使用过滤器执行 CardDAV REPORT 请求来完成此操作:

<C:filter test="allof"> 
<C:prop-filter name="CATEGORIES"  test="allof"> 
<C:text-match collation="i;unicode-casemap" 
match-type="contains" 
>searched_value</C:text-match> 
</C:prop-filter> 
</C:filter> 

这个过滤器的问题是它会匹配属性中任何位置传递的值,这意味着它也会匹配另一个值中的值,例如:

如果我搜索“朋友”,它将匹配“工作、朋友、同事”以及“工作、足球朋友、同事”。

我找不到使用 WebDAV 过滤器在逗号分隔列表中仅获取“完整”值的方法。

4

1 回答 1

3

我终于使用不同的匹配类型解决了这个问题:

<C:filter> 
<C:prop-filter name="CATEGORIES"  test="anyof"> 
<C:text-match collation="i;unicode-casemap" 
match-type="equals">value</C:text-match> 
<C:text-match collation="i;unicode-casemap" 
match-type="contains">,value,</C:text-match> 
<C:text-match collation="i;unicode-casemap" 
match-type="ends-with">,value</C:text-match> 
<C:text-match collation="i;unicode-casemap" 
match-type="starts-with">value,</C:text-match> 
</C:prop-filter> 
</C:filter> 

细节:

如果任何包含的文本匹配匹配(逻辑或),则匹配:

<C:prop-filter name="CATEGORIES"  test="anyof"> 

此文本匹配将匹配与该值完全相等的值(这是逗号分隔列表中唯一的值):

<C:text-match collation="i;unicode-casemap" 
match-type="equals">value</C:text-match> 

这将匹配包含两个逗号之间的值的值(这是逗号分隔列表中间部分的值):

<C:text-match collation="i;unicode-casemap" 
match-type="contains">,value,</C:text-match> 

这将匹配以逗号结尾的值,后跟值(这是逗号分隔列表最后位置的值):

<C:text-match collation="i;unicode-casemap" 
match-type="ends-with">,value</C:text-match> 

这将匹配以逗号开头的值开头的值(这是逗号分隔列表的第一个位置的值):

<C:text-match collation="i;unicode-casemap" 
match-type="starts-with">value,</C:text-match> 

这样,这只会匹配逗号分隔列表中的完整值。

于 2013-01-03T14:50:08.683 回答