CTS和xPath都有必要吗?

时间:2016-03-23 16:49:21

标签: xpath xquery marklogic

我有以下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')
    ))
)

2 个答案:

答案 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中,想法是一个文档应该反映一个“记录”。是否有可能重构您的文档以避免在第一时间进行过滤?