Xpath& Xquery:选择并返回包含多个复杂标记的XML元素

时间:2016-07-24 09:37:19

标签: xml xpath xquery xpath-2.0

我最近被介绍到了XPath和XQuery的精彩世界。我已经能够使用逻辑运算符构造一些查询,但我遇到了一个特定的问题,我似乎无法找到答案。它涉及标签周围的“包裹”属性。

我正在使用Exide搜索XML文档,结构看起来不像我在研究时看到的任何内容。它看起来像这样:

<Report name="Report001">
    <ReportDetail name="SubSection1">
        <Properties>
            <tag name="bar">blue</tag>
            <tag name="bar2">green</tag>
            <tag name="bar3">yellow</tag>
            <tag name="bar4">white</tag>
        </Properties>
             <ReportItem detail1="some value" detail2="some value" detail3="some value" detail4="some value" detail5="some value">
                <item1>foo</item1>
                <item2>foo2</item2>
                <item3>foo3</item3>
                <item4>foo4</item4>
                <item5>foo5</item5>
             </ReportItem>
     </ReportDetail>
     <ReportDetail name="SubSection2">
        <Properties>
            <tag name="bar">blue</tag>
            <tag name="bar2">green</tag>
            <tag name="bar3">pink</tag>
            <tag name="bar4">lime</tag>
        </Properties>
            <ReportItem detail1="some value2" detail2="some value2"detail3="some value2" detail4="some value2" detail5="some value2">
                <item1>foo</item1>
                <item2>foo2</item2>
                <item3>foo3</item3>
                <item4>foo4</item4>
                <item5>foo5</item5>
            </ReportItem>
      </ReportDetail>
</Report>

我正在尝试搜索(并计算)然后在查询中返回的是那些 ReportDetail名称其中

  1. 标记名称与bar2匹配
  2. 标签本身包含(或等于)绿色
  3. 和item3等于foo3
  4. 我尝试过以下各种变体: 对于查询的前两部分,已生成以下查询

    count(//Properties/tag[@name='bar2'] | /tag[. ,'green']))
    
    count//Properties/tag[@name='bar2'][. ,'green']))
    
    count(//Properties[contains(@name, "bar2")])
    

    对于查询的第三部分,我认为它应该看起来像其中之一:

    and //ReportItem[item3=foo3])        
    
    //ReportItem[item3=foo3]
    

    所以整个查询看起来像:

    count(//Properties/tag[@name='bar2'] | /tag[. ,'green'] and /ReportItem[item3=foo3)
    

2 个答案:

答案 0 :(得分:1)

您还没有准确地指出问题。让我们假设当你说:

我试图搜索(并计算)然后在查询中返回那些ReportDetail名称

标签名称与bar2匹配 标签本身包含(或等于)绿色 和item3等于foo3

你的意思是:

我尝试返回满足以下所有条件的ReportDetail元素的名称:

  • 有一个带有子标记的子属性,其名称与bar2
  • 相匹配
  • 有一个带有子标记的子属性(不一定是同一个),其字符串值为绿色
  • 有一个子ReportItem,子item3等于foo3
那么那将是

//ReportDetail[Properties/tag[@name='bar2'] and Properties/tag[.='green'] and ReportItem/item3[.='foo3]]

在我看来,你真正的问题不在于编写XPath,而是在逻辑上和明确地表达你真正想要获得的信息。

答案 1 :(得分:0)

您的Xpath语法不正确。我想,应该是:

count(//Properties/tag[@name='bar2'] | //tag[.='green'] | //ReportItem[item3='foo3'])