XQuery возвращает ошибку..?

Ниже файл 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 городов, содержащих слово " Столица", но возвращает ошибку. Запрос -

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

и ошибка -Ошибка: [XPTY0004] Ожидается один элемент (элемент Desc { ... }, элемент Desc { ... }, ...) найден.

Пожалуйста, помогите мне.. Требуется ли использовать FLWOR для таких запросов?

2 ответа

Решение

Ваш оригинальный запрос мог быть переписан следующим образом...

/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

С таким же успехом вы можете использовать содержащееся в нем текстовое выражение, чтобы игнорировать регистр, диакритические знаки и т. Д. В ваших ключевых словах:

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

Надеюсь это поможет.

Ваш предикат [contains(Country/City/Desc,'Capital')] выбирает все Desc узлы, содержащие 'Capital' для Continent элемент, поэтому он оценивает три элемента. Чтобы это исправить, просто переместите предикат в City элемент (в конце концов, вы хотите отфильтровать City элементы, а не Continent). Я не проверял это, но я ожидал, что это сработает:

/Continents/Continent/Country/City[contains(Desc,'Capital')]/Name
Другие вопросы по тегам