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