首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xPath和CTS都是必要的吗?

xPath和CTS都是必要的吗?
EN

Stack Overflow用户
提问于 2016-03-23 16:49:20
回答 2查看 173关注 0票数 3

我有以下CTS搜索查询:

代码语言:javascript
复制
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表达式,如上面的示例所示?

这与我想要的类似,但它不适用于注释中指定的问题:

代码语言:javascript
复制
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')
    ))
)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-23 17:01:13

您仍然可以查询父类,即使您的搜索是跨子层的:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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']
票数 3
EN

Stack Overflow用户

发布于 2016-03-23 17:19:10

我们给了你答案。然而,这一切都来自于需要过滤。在MarkLogic中,其思想是一个文档应该反映一个“记录”。是否有可能重构您的文档以避免首先进行过滤?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36184104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档