如何在CardDAV(WebDAV)REPORT请求中执行高级过滤器

时间:2013-01-03 11:19:15

标签: http filter report webdav carddav

我的vcards有一个CATEGORIES属性,其中包含逗号分隔的值列表。我想要的是在这个以逗号分隔的列表中的某处获取所有传递值的vcards。

我正在尝试使用过滤器执行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过滤器在逗号分隔列表中仅获取“完整”值的方法。

1 个答案:

答案 0 :(得分:2)

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

<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> 

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