2012-04-25 3 views
1

Ниже приведен XML-файл -XQuery возвращает ошибку ..?

<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] Одиночный деталь как ожидается, (элемент Описание изделия {...}, элемент Описание изделия {...}, ...) найдены.

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

ответ

4

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

/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 

... но оба из запросов будут возвращать все страны любого континента, который содержит описание города, содержащее «Cap итал. Вместо этого, это, вероятно, то, что вы ищете:

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

Вы можете также использовать выражение contains text игнорировать регистр, диакритические и т.д. в ваших ключевых словах:

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

Надеется, что это помогает.

1

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

/Continents/Continent/Country/City[contains(Desc,'Capital')]/Name 
Смежные вопросы