我最近被介绍到了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名称其中
我尝试过以下各种变体: 对于查询的前两部分,已生成以下查询
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)
答案 0 :(得分:1)
您还没有准确地指出问题。让我们假设当你说:
我试图搜索(并计算)然后在查询中返回那些ReportDetail名称
标签名称与bar2匹配 标签本身包含(或等于)绿色 和item3等于foo3
你的意思是:
我尝试返回满足以下所有条件的ReportDetail元素的名称:
//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'])