Xpath / Xquery на BaseX не возвращает результатов

Пытаюсь использовать XPath / Xquery в первый раз в BaseX, и у меня есть коллекция / база данных opendata.gov для фрагмента кода автостоянки ниже,

<?xml version="1.0" encoding="utf-8"?>
<CarParkDataImport xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://www.transportdirect.info/carparking B:/CODE/carparks/CarParking.xsd" xmlns="http://www.transportdirect.info/carparking">
<CarPark>
    <CarParkRef>3</CarParkRef>
    <CarParkName>Nunnery Lane</CarParkName>
    <Location>York</Location>
    <Address>Nunnery Lane--York--North Yorkshire</Address>
    <Postcode>YO23 1AA</Postcode>
</CarPark>

то, что я пытаюсь сделать, это найти, где местоположение является определенным местом, в этом случае "Nunnery Lane", а затем вернуть ссылку на парковку, поэтому я попытался (база данных называется Car_park_data и имеет 8 документов внутри)

collection("Car_park_data")/CarParkDataImport/CarPark[Location="Nunnery Lane"]/CarParkRef

а потом попробовал flowr

for $x in collection("Car_park_data")/CarParkDataImport/CarPark
where $x/Location="Nunnery Lane"
order by $x/CarParkRef
return $x/CarParkRef

оба не возвращают никаких совпадений .. полная информация о первом запросе (бит результата basex)

Compiling:
- pre-evaluating fn:collection("Car_park_data")
- adding text() step
- applying text index
Query:
collection("Car_park_data")/CarParkDataImport/CarPark[Location="Nunnery  Lane"]/CarParkRef
Optimized Query:
db:text("Car_park_data", "Nunnery  Lane")/parent::Location/parent::CarPark[parent::CarParkDataImport/parent::docume nt-node()]/CarParkRef
Result:
- Hit(s): 0 Items
- Updated: 0 Items
- Printed: 0 Bytes
- Read Locking: local [Car_park_data]
- Write Locking: none
Timing:
- Parsing: 1.33 ms
- Compiling: 0.54 ms
- Evaluating: 0.36 ms
- Printing: 0.28 ms
- Total Time: 2.52 ms
Query plan:
<QueryPlan>
<CachedPath>
 <ValueAccess data="Car_park_data" type="TEXT">
  <Str value="Nunnery Lane" type="xs:string"/>
 </ValueAccess>
 <IterStep axis="parent" test="Location"/>
  <IterStep axis="parent" test="CarPark">
  <CachedPath>
    <IterStep axis="parent" test="CarParkDataImport"/>
    <IterStep axis="parent" test="document-node()"/>
  </CachedPath>
   </IterStep>
   <IterStep axis="child" test="CarParkRef"/>
  </CachedPath>
</QueryPlan>

Что я делаю не так? Как я уже сказал, используя basex, вы можете видеть, что это жизнеспособный Xpat / Xquery (т.е. basex не сообщает об ошибках), но я предполагаю, что что-то не так в моем Xquery?

если я сделаю «поиск» с помощью BaseX для «Nunnery Lane», это будут результаты, которые вернутся

Query:
/descendant-or-self::*[text() contains text "Nunnery Lane"]
Result:
- Hit(s): 4 Items
- Updated: 0 Items
- Printed: 601 Bytes
- Read Locking: global
- Write Locking: global

поэтому я затем попытался добавить содержащий текст в свой запрос, в тот же avale, без совпадений

Спасибо за любую помощь


person funkmaster20th    schedule 12.04.2015    source источник


Ответы (1)


Примите во внимание пространство имен, добавив

declare default element namespace "http://www.transportdirect.info/carparking";

см. http://www.w3.org/TR/xquery/#id-default-namespace.

person Martin Honnen    schedule 12.04.2015
comment
Спасибо за ответ, я добавил его перед обоими запросами, и он имеет тот же результат, но все еще нет совпадений, разве BaseX не объявляет пространство имен для вас, когда вы создаете xml как базу данных? - person funkmaster20th; 12.04.2015
comment
Что ж, в вашем образце <Location>York</Location>, а в вашем запросе Location="Nunnery Lane", поэтому я не понимаю, как это условие может быть истинным. Я думаю, что объявление пространства имен необходимо для работы с XML с пространствами имен. Поэтому попробуйте выполнить условие CarParkName = "Nunnery Lane", если ваш XML действительно <CarParkName>Nunnery Lane</CarParkName> опубликован. - person Martin Honnen; 12.04.2015
comment
РЕДАКТИРОВАТЬ: хорошо .. по какой-то причине ... сейчас работает ... Спасибо .. declare default element namespace "http://www.transportdirect.info/carparking"; /CarParkDataImport/CarPark[Location="York"]/CarParkRef возвращает результаты, извините, йорк был всего лишь фрагментом, переулок монастыря находится в остальной части xml, спасибо за вашу помощь - person funkmaster20th; 12.04.2015
comment
Наконец-то решение. Некоторое время назад я отказался от попыток использовать BaseX и просто вернулся к нему, чтобы попробовать датамайнинг. Это существенное упущение в документации по началу работы / учебника, поскольку XML для большинства людей объявляет свое собственное пространство имен. Вы можете заставить BaseX удалить пространство имен при создании новой базы данных из существующего XML-файла, см. Вкладку «Анализ». - person JamesP; 02.07.2018