我有以下CTS搜索查询:
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:query中使用相同的逻辑,就像我在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')
))
)
答案 0 :(得分:3)
即使您的搜索是跨越孩子,您仍然可以查询父级:
cts:search(/parent/child,
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')
))
)
这将作为过滤搜索运行,但由于您无论如何手动进行过滤,因此性能应大致相当。
<强>更新强>
我测试了这个并且上面的断言是错误的。我认为这是正确的,但显然cts:search
过滤会过滤掉与可搜索表达式完全不匹配的结果。父母将超出可搜索表达的范围。
理想情况下,您可以在child
元素上拆分文档,但至少可以删除重叠的查询和XPath:
cts:search(/parent/child,
cts:and-query((
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::parent/@attr = 'value']
答案 1 :(得分:1)
wst给了你答案。但是,这一切都需要过滤。在MarkLogic中,想法是一个文档应该反映一个“记录”。是否有可能重构您的文档以避免在第一时间进行过滤?