У меня есть следующий CTS поисковый запрос:CTS и xPath оба необходимы?
cts:search(/parent,
cts:and-query((
cts:element-attribute-value-query(xs:QName('parent'), xs:QName('attr'), 'value'),
cts:element-attribute-value-query(xs:QName('child'), xs:QName('attr-1'), 'value-2'),
cts:element-attribute-value-query(xs:QName('child'), xs:QName('attr-2'), 'value-3')
))
)/child[@attr-1 eq 'value-2' and @attr-2 eq "value-3"]
(: Returns /parent/child elements matching criteria :)
У меня есть несколько классификаторов на родителей, а также отборочные на детей. Конечный результат, который я хочу, это только дети. Для того, чтобы сделать это, как вы можете видеть сверху, я должен:
- Поиск документов, которые соответствуют критериям родителя + критерии дети
- После получения этого документа, отфильтровать детей по тем же критериям логики как указано выше
Это работает, но кажется очень глупым, что у меня должна быть такая же логика в запросе cts: как и у xPath для детей. Логика дублируется без необходимости.
Есть ли способ, которым я могу сделать это все в cts: query, и не должен иметь дополнительных выражений xPath, как в примере выше?
Это похоже на то, что я хочу, но он не работает для задачи, указанной в комментариях:
cts:search(/parent/child,
cts:and-query((
cts:element-attribute-value-query(xs:QName('parent'), xs:QName('attr'), 'value'), (: The problem is this line... I can't filter by the parent, as it is above the scope of my first parameter (/parent/rule) :)
cts:element-attribute-value-query(xs:QName('child'), xs:QName('attr-1'), 'value-2'),
cts:element-attribute-value-query(xs:QName('child'), xs:QName('attr-2'), 'value-3')
))
)
Это не работает для меня. Когда у меня есть '/ parent' как выражение для поиска, я возвращаю родителя из cts: search. Когда я помещаю выражение '/ parent/child' в выражение для поиска, я ничего не получаю. Сам вопрос cts: query никогда не изменяется, все, что я меняю, - это выражение для поиска. Когда у меня есть '/ parent/child', он не работает. Мое предположение - это первый элемент-атрибут-значение-запрос на родительском, выкидывает все, так как он не находится под выражением поиска (?) – CtheGood
Спасибо за ваше обновление wst. Вы также можете легко отменить логику и захватить родителя из cts: search, а затем отфильтровать дочерние элементы с помощью xPath. Там, где вы отфильтровывали детей, в моем случае на самом деле будет быстрее, поскольку это более специфично, чем родители. Я все еще надеялся (по вопросу) решить все это в cts: искать чисто стилистические причины, но, возможно, это невозможно.Является ли вычисление одинаковым для фильтрации cts: search, поскольку оно предназначено для фильтрации с помощью выражения xPath? – CtheGood
@CtheGood Computationally, делая cts: поиск делает как можно больше тяжелого подъема, является лучшей стратегией. Все результаты, которые он может вернуть * нефильтрованный *, будут разрешены с использованием только индексов, поэтому они будут очень быстрыми. Если вам нужно использовать фильтрацию через cts: search или вручную через XPath, тогда база данных должна: 1) выбрать больше документов, чем это могло бы иначе, и 2) загрузить их в память для фильтрации. Нет общего правила, как максимизировать первое и минимизировать последнее - это просто зависит от ваших документов, поэтому тестирование разных подходов - это все, что вы можете сделать. – wst