Не знаю, почему это не работает, но у меня есть обходной путь для вас.
Я добавил контейнер с именем *
в ограничение диапазона, который выбирает все, что больше, например, пустую строку (это все, что я думаю).
xquery version "1.0-ml";
xdmp:document-insert('test.xml', <doc><test>hello world</test></doc>);
xdmp:document-insert('test2.xml', <doc><test>hello world 2</test></doc>);
xdmp:document-insert('test3.xml', <doc><test></test></doc>);
xdmp:document-insert('test4.xml', <doc></doc>);
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";
let $options :=
<options xmlns="http://marklogic.com/appservices/search">
<constraint name="test">
<range type="xs:string">
<field name="test"/>
<bucket ge="" name="*"></bucket>
</range>
</constraint>
<term>
<term-option>case-insensitive</term-option>
<term-option>punctuation-insensitive</term-option>
<term-option>whitespace-insensitive</term-option>
<term-option>wildcarded</term-option>
</term>
<transform-results apply="empty-snippet"/>
</options>
return search:search("test:*", $options)
Возвращает test.xml
, test2.xml
и test3.xml
, которые имеют элемент test
.
При поиске "-(test:*)"
возвращает только test4.xml
, который является единственным документом, в котором нет элемента test
.
Другим вариантом может быть использование опции дополнительный запрос для добавления сериализованного запроса cts, который выбирает документы [не], содержащие ваш элемент. Это было бы более чистым решением в моих глазах, поскольку ведро кажется немного хакерским.