Документация cts:element-attribute-values
для $query
гласит:
Включать только значения во фрагменты, выбранные запросом cts:, и вычислять частоты из этого набора включенных значений.Значения не обязательно должны соответствовать запросу , но они должны присутствовать во фрагментах, выбранных запросом .Фрагменты не фильтруются, чтобы убедиться, что они соответствуют запросу, но вместо этого выбираются так же, как «нефильтрованные» операции cts: search.Если строка введена, строка обрабатывается как cts: word-query указанной строки.
Как вы уже заметили, ваш фильтр запросов не работает без фильтра, потому что он возвращает ложные срабатывания.cts:element-attribute-values
также не имеет опции фильтрации.
Вы можете попробовать сделать следующее:
Создать корень фрагмента для Child
.Это позволяет выполнить ваш запрос без фильтрации без возврата ложных срабатываний.
cts:element-attribute-values(xs:QName("Root"),xs:QName("Id"), (), (),
cts:and-query((
cts:element-value-query(xs:QName("Name"), "ABC"),
cts:document-fragment-query(
cts:element-query(xs:QName("Child"),
cts:and-query((
cts:element-value-query(xs:QName("Key"), "1"),
cts:element-range-query(xs:QName("Value"), "<", 15)
))
)
)
))
)
Объяснение того, что я здесь сделал:
Путем создания корня фрагмента в Child
каждый дочерний элемент сохраняется всобственный фрагмент.Таким образом, and-query для Key
и Value
возвращает только фрагменты, которые действительно содержат заданные значения.Создав document-fragment-query
, вы проверите, содержит ли документ один из фрагментов (это необходимо, потому что поиск по фрагментам не работает).
Надеюсь, это поможет.