2

私のvcardには、カンマ区切りの値のリストを持つCATEGORIESプロパティがあります。私が欲しいのは、このコンマ区切りのリストのどこかに渡された値を持つすべてのvcardを取得することです。

これを実現するために、フィルターを使用してCardDAVREPORTリクエストを実行しようとしています。

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

このフィルターの問題は、これがプロパティ内の任意の場所で渡された値と一致することです。これは、別の値内の値とも一致することを意味します。たとえば、次のようになります。

「friends」を検索すると、「work、friends、colleagues」だけでなく「work、football_friends、coleagues」にも一致します。

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> 

詳細:

含まれるテキスト一致のいずれかが一致する場合に一致します (論理 OR):

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

このテキスト一致は、値と正確に等しい値と一致します (これは、コンマ区切りリスト内の唯一の値である値です)。

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

これは、2 つのコンマの間の値を含む値と一致します (これは、コンマで区切られたリストの中間部分の値です)。

<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 に答える