Как сопоставить пространство в MarkLogic с помощью функций CTS?

Мне нужно искать те элементы, у которых есть место " " в их атрибутах.

Например:

<unit href="http:xxxx/unit/2 ">

Предположим, что в приведенном выше коде есть место в последнем атрибуте href.

Я сделал это с помощью FLOWER запрос. Но мне нужно, чтобы это было сделано с помощью функций CTS. Пожалуйста, предложите.

За FLOWER запрос я пробовал это:

let $x := (
  for $d in doc()
  order by $d//id
  return            
   for $attribute in data($d//@href)
   return                
   if (fn:contains($attribute," ")) then 
     <td>{(concat( "id = " , $d//id) ,",  data =", $attribute)}</td> 
   else ()
)
return <tr>{$x}</tr>

Это работает нормально.

За CTS я пытался

let $query := 
  cts:element-attribute-value-query(xs:QName("methodology"), 
                                    xs:QName("href"), 
                                    xs:string(" "),
                                    "wildcarded")                  
let $search := cts:search(doc(), $query)    
return fn:count($search)

1 ответ

Ваш запрос ищет, чтобы " " являлось полнотой значения атрибута. Если вы хотите искать атрибуты, содержащие пробел, вам нужно использовать подстановочные знаки. Однако, поскольку нет индексации пробелов, за исключением запросов с точными значениями (которые по определению не являются символами подстановки), вы не собираетесь получать большую поддержку индекса для этого запроса, поэтому вам нужно будет выполнить это как отфильтрованный поиск. (что у вас есть в вашем коде выше) с большим количеством ложных срабатываний.

Возможно, лучше создать индекс диапазона строк для атрибута и выполнить сопоставление значений для него.

Другие вопросы по тегам