【问题标题】:Marklogic 6 how to get attribute value using xquery?Marklogic 6 如何使用 xquery 获取属性值?
【发布时间】:2016-04-16 11:13:58
【问题描述】:

XML:1

<?xml version="1.0" encoding="UTF-8"?>
<PE uri="/MY/Cases/ILJ/ilj2010_1_00042.xml">
          <P name="antony" value="cse"/>
          <P name="type" value="reported"/>
          <P name="year" value="2010"/>
          <P name="part" value="1"/>
          <P name="volume" value="2"/>
          <P name="decdate-year" value="2010"/>
          <P name="decdate-month" value="01"/>
          <P name="decdate-day" value="27"/>
</PE>

XML:2

<?xml version="1.0" encoding="UTF-8"?>    
<PE uri="/MY/Cases/ILJ/ilj2010_1_00042.xml">
          <P name="antony" value="cse"/>
          <P name="type" value="reported"/>
          <P name="year" value="2010"/>
          <P name="part" value="1"/>
          <P name="volume" value="1"/>
          <P name="decdate-year" value="2010"/>
          <P name="decdate-month" value="01"/>
          <P name="decdate-day" value="27"/>
</PE>

我正在使用下面的 Xquery 来区分多个 xml。但我没有得到确切的输出。这里我的问题是如何过滤具有多个属性的元素? 我想得到 Volume =2 的结果意味着它应该只返回第一个 xml。

我的查询

xquery version "1.0-ml";
declare namespace xs = "http://www.w3.org/2001/XMLSchema";

let $value1  := "antony"
let $value2 := "cse"
let $value3  := "year"
let $value4 := "2010"
let $value5  := "volume"
let $value6 := "2"
let $value7  := "part"
let $value8 := "1"

    for  $uri1 in cts:uris((),(), (
          cts:element-query(xs:QName("P"),

            cts:and-query(
            (
cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value1)  ,
cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value2),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value3),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value4),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value5),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value6),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value7),
cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value8)

))
 )) )

return doc($uri1)

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    最好的方法是改变 XML 表示并用元素或属性名称而不是属性值来显示模型的语义,如下所示:

    <pe>
        <type>reported</type>
        <part>1</part>
        <volume>1</volume>
        <date>2010-01-27</date>
    </pe>
    

    然后查询变成如下:

    cts:element-query(xs:QName("pe"), (
        cts:element-value-query(xs:QName("type"),"reported"),
        cts:element-value-query(xs:QName("part"),"1"),
        cts:element-value-query(xs:QName("volume"),"1"),
        cts:element-value-query(xs:QName("date"),"2010-01-27")
        ))
    

    此方法还允许您在值上创建有用的范围索引或路径范围索引。

    希望对您有所帮助,

    【讨论】:

      【解决方案2】:

      对于每个名称/值属性对,使用 cts:element-query() 指定 P 元素,并使用包含 cts:element-attribute-value-query()criteria 的 cts:and-query() 用于该特定 P 元素的两个属性。

      这将确保同一 P 元素上的两个属性都必须满足条件,而不仅仅是测试以确保在文档中的任何位置都存在具有该值的属性。

      xquery version "1.0-ml";
      declare namespace xs = "http://www.w3.org/2001/XMLSchema";
      
      let $value1  := "antony"
      let $value2 := "cse"
      let $value3  := "year"
      let $value4 := "2010"
      let $value5  := "volume"
      let $value6 := "2"
      let $value7  := "part"
      let $value8 := "1"
      
      for  $uri1 in cts:uris((),(), (
            cts:element-query(xs:QName("P"),
              cts:and-query((
               cts:element-query(xs:QName("P"), cts:and-query((
                  cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value1),
                  cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value2)))),
               cts:element-query(xs:QName("P"), cts:and-query((
                  cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value3),
                  cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value4)))),
                cts:element-query(xs:QName("P"), cts:and-query((
                  cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value5), 
                  cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value6)))),
               cts:element-query(xs:QName("P"), cts:and-query((
                  cts:element-attribute-value-query(xs:QName("P"),xs:QName("name"),$value7),
                  cts:element-attribute-value-query(xs:QName("P"),xs:QName("value"),$value8))))
           )) )) )
      
      return doc($uri1)
      

      cts:element-query()

      搜索 匹配指定元素及其所有后代。如果 第二个参数中指定的查询有任何 cts:element-attribute-*-query 构造函数,它将搜索属性 直接在任何后代的指定元素和属性上 元素。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多