2

以下是 XML 文件 -

<Continents>
  <Continent n="Asia">
    <Country n="Thailand">
      <City>
        <Name>Bangkok</Name>
        <Desc>Capital on Thailand</Desc>
      </City>
    </Country>
    <Country n="India">
      <City>
        <Name>New Delhi</Name>
        <Desc>Capital on India</Desc>
      </City>
      <City>
        <Name>Mumbai</Name>
        <Desc>Financial capital on India</Desc>
      </City>
      <City>
        <Name>Chennai</Name>
        <Desc>A very good city</Desc>
      </City>
    </Country>
  </Continent>
</Continents>

使用 baseX,我正在编写一个查询来显示Name包含单词Capital但返回错误的城市。查询是 -

/Continents/Continent[contains(Country/City/Desc,'Capital')]/Country/City/Name

错误是 - 错误:[XPTY0004] 预期单个项目,(元素 Desc { ... },元素 Desc { ... },...)找到。

请帮帮我.. 是否需要使用 FLWOR 进行此类查询?

4

2 回答 2

5

您的原始查询可能已重写如下...

/Continents/Continent[
  some $x in Country/City/Desc satisfies contains($x,'Capital')]
  /Country/City/Name

...或者...

/Continents/Continent[
  for $x in Country/City/Desc
  where contains($x,'Capital')
  return $x]/Country/City/Name

...但是这两个查询都将返回包含包含“首都”的城市描述的任何大陆的所有国家/地区。相反,这可能是您正在寻找的:

/Continents/Continent/Country/City[contains(Desc,'Capital')]/Name

您也可以使用contains 文本 表达式来忽略关键字中的大小写、变音符号等:

/Continents/Continent/Country/City[Desc contains text 'Capital']/Name

希望这可以帮助。

于 2012-04-25T11:43:17.807 回答
2

您的谓词[contains(Country/City/Desc,'Capital')]选择包含该元素的所有Desc节点,因此它评估为三个元素。要解决此问题,只需将谓词移动到元素(毕竟,您要过滤元素,而不是)。我没有测试它,但我希望它能够工作:'Capital'ContinentCityCityContinent

/Continents/Continent/Country/City[contains(Desc,'Capital')]/Name
于 2012-04-25T11:39:03.943 回答