Marklogic元素查询

时间:2017-12-29 10:24:13

标签: marklogic marklogic-8

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

    <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

,它也会给出结果

2 个答案:

答案 0 :(得分:1)

您应该使用cts:element-query()

在元素上使用范围启动查询

答案 1 :(得分:0)

您希望将两个属性值查询约束到相同的Abc父元素。您需要在cts:element-query上执行Abc才能实现这一目标。对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!