我有以下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')
))
)发布于 2016-03-23 17:01:13
您仍然可以查询父类,即使您的搜索是跨子层的:
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']发布于 2016-03-23 17:19:10
我们给了你答案。然而,这一切都来自于需要过滤。在MarkLogic中,其思想是一个文档应该反映一个“记录”。是否有可能重构您的文档以避免首先进行过滤?
https://stackoverflow.com/questions/36184104
复制相似问题