【问题标题】:Marklogic Element QueryMarklogic 元素查询
【发布时间】:2017-12-29 10:24:13
【问题描述】:

我正在尝试编写一个 Xquery 来从数据库中搜索一个 xml,该数据库具有任何具有 R="3" 的 Abc 节点,并且它应该具有任何对应的具有 attr="106" 的 XYZ 节点

    <Abc ID="X" Src="D" R="1">
         <XYZ ID="4101847" attr="106">
         </XYZ>
         <XYZ ID="Y" attr="105">
         </XYZ>
    </Abc>
    <Abc ID="Z" Src="G" R="73">
    </Abc>
    <Abc ID="P" Src="B" R="3">
         <XYZ ID="Q" attr="106">
         </XYZ>
         <XYZ ID="R" attr="101">
         </XYZ>
         <XYZ ID="" attr="100">
         </XYZ>
    </Abc>

我试过下面的查询

cts:element-query(
    fn:QName("namespace","Parent"), cts:and-query(
          (
               cts:element-attribute-value-
query(fn:QName("namespace","Abc"),xs:QName("R"),"3"),
               cts:element-attribute-value-
query(fn:QName("namespace","XYZ"),xs:QName("attr"),"106")

        )   
        ) 
)

即使任何其他 Abc 的 XYZ 节点匹配 attr 为 106,它也会给我结果

【问题讨论】:

    标签: marklogic marklogic-8


    【解决方案1】:

    您应该使用 cts:element-query() 元素的范围开始查询

    【讨论】:

    • David 的好建议的一个脚注:一般来说,将每条记录放在单独的文档中并通过查询聚合记录会更有效。因此,您可以考虑将每个 Abc 元素放在单独的文档中。
    • 已经用过其实上面提到的查询都包含在 cts:element-query(fn:QName("namespace","Parent") , aboveMentionedQuery) 其中Parent是上面xml的父节点
    • 也更新了post中的查询完整的xml包含在
    • 根据您的示例,作用域父元素将被称为 Abc
    【解决方案2】:

    您希望将两个属性值查询限制在同一个 Abc 父元素上。您需要在Abc 上执行cts:element-query 才能实现这一目标。对Abc 的父级进行元素查询会太高。下面的一些代码可以更清楚地说明事情。请注意,为了更好地理解,我将您的 Abc 示例保存为单独的文件:

    xquery version "1.0-ml";
    
    xdmp:document-insert("/abc1.xml",
      <Abc ID="X" Src="D" R="1">
             <XYZ ID="4101847" attr="106">
             </XYZ>
             <XYZ ID="Y" attr="105">
             </XYZ>
        </Abc>
    ),
    xdmp:document-insert("/abc2.xml",
        <Abc ID="Z" Src="G" R="73">
        </Abc>
    ),
    xdmp:document-insert("/abc3.xml",
        <Abc ID="P" Src="B" R="3">
             <XYZ ID="Q" attr="106">
             </XYZ>
             <XYZ ID="R" attr="101">
             </XYZ>
             <XYZ ID="" attr="100">
             </XYZ>
        </Abc>
    )
    
    ;
    
    cts:search(collection(), cts:element-query(
      xs:QName("Abc"),
      cts:and-query((
        cts:element-attribute-value-query(
          xs:QName("Abc"),
          xs:QName("R"),
          "3"
        ),
        cts:element-attribute-value-query(
          xs:QName("XYZ"),
          xs:QName("attr"),
          "106"
        )
      ))
    ))
    

    HTH!

    【讨论】:

      猜你喜欢
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多