Получение выбора дочерних узлов в XML с помощью Xquery

Я что-то упускаю, но не уверен, что. Я использую BaseX и Http-сервер для передачи REST GET в XML, который я хранил в данных, который выглядит следующим образом.

 <?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>
    <Notes>Open 24 hours. Park and pay by phone in this car park by calling 01904 279279. The location number for this car park is 7709. Blue badge holders can park free for as long as they want. CCTV &amp; toilets. Permit parking available.</Notes>
    <Telephone>01904551309</Telephone>
    <URL>http://www.york.gov.uk/transport/Parking/Car_parks/nunnery_ln/</URL>
</CarPark>
</CarParkDataImport>

теперь у меня есть 2 Xqueries, которые я сохранил на HTTP-сервере для запроса

(: XQuery file: location.xq :)
declare default element namespace "http://www.transportdirect.info/carparking";
declare variable $a as xs:string external;
db:open("Car_park_data")/CarParkDataImport/CarPark[Location=$a]

и

(: XQuery file: loc.xq :)
declare default element namespace "http://www.transportdirect.info/carparking";
declare variable $a as xs:string external;
for $b in db:open("Car_park_data")/CarParkDataImport/CarPark
where $b/Location = $a
return $b/. 

поэтому я могу запустить свой REST http как (с изменением .xq в зависимости от того, что я запрашиваю.

http://localhost:8984/rest?run=loc.xq&$a=York

Они оба работают и возвращают все узлы в CarPark, но как мне просто вернуть выбранные узлы? Например, CarParkName, местоположение и почтовый индекс.


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


Ответы (1)


как мне просто вернуть выбор узлов? Например, CarParkName, местоположение и почтовый индекс

Тогда возвращайте не все, что содержится в $b, а только его часть. Следующий запрос возвращает только те элементы Location, CarParkName и Postcode парковки, которые соответствуют местоположению.

Запрос адаптирован для работы в моей локальной системе, в остальном он идентичен вашему.

(: XQuery file: loc.xq :)
declare default element namespace "http://www.transportdirect.info/carparking";
let $a := "York"
for $b in doc("carpark.xml")/CarParkDataImport/CarPark
where $b/Location = $a
return $b/(Location | CarParkName | Postcode)

вернет эти три узла и некоторые объявления пространств имен, которые не нужны, но они также не должны мешать.

<?xml version="1.0" encoding="UTF-8"?>
<CarParkName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://www.transportdirect.info/carparking">Nunnery Lane</CarParkName>
<Location xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://www.transportdirect.info/carparking">York</Location>
<Postcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://www.transportdirect.info/carparking">YO23 1AA</Postcode

я получаю следующее сообщение об ошибке. «ошибка в строке 2 в столбце 1: дополнительный контент в конце документа», и он показывает только одно название автостоянки, будет ли журнал в BaseX, я могу проверить, что происходит,

Я не знаком с файлами журналов BaseX, но проблема в том, что ответ не является правильно сформированным XML; у него нет ни одного корневого элемента, как уже услужливо указал joemfb. Итак, решение состоит в том, чтобы обернуть возвращаемые элементы корневым элементом:

declare default element namespace "http://www.transportdirect.info/carparking";
let $a := "York"
for $b in doc("carpark.xml")/CarParkDataImport/CarPark
where $b/Location = $a
return
<root>
{$b/(Location | CarParkName | Postcode)}
</root>

и результат:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.transportdirect.info/carparking">
   <CarParkName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Nunnery Lane</CarParkName>
   <Location xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">York</Location>
   <Postcode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">YO23 1AA</Postcode>
</root
person Mathias Müller    schedule 20.04.2015
comment
Спасибо, это прекрасно работает. В BaseX результаты возвращаются, как указано, и возвращают все автостоянки с этим местоположением, но когда я отправляю REST http, я получаю следующее сообщение об ошибке. «ошибка в строке 2 в столбце 1: дополнительный контент в конце документа», и он просто показывает одно название автостоянки, будет ли журнал в BaseX, я могу проверить, что происходит, так как я ничего не вижу в Сам XML? - person funkmaster20th; 21.04.2015
comment
Возможно, вам придется обернуть эти элементы в корневой элемент. Самый простой способ — обернуть весь запрос в конструктор элемента: element results { let $a .... }. - person joemfb; 21.04.2015
comment
@joemfb Вы правы, это причина ошибки. На самом деле, на мой взгляд, литеральный корневой элемент <results> более нагляден, чем конструктор элемента. - person Mathias Müller; 21.04.2015
comment
@mathias и joemfb Если бы я мог отправить торт через Интернет, я бы смог, спасибо, это возвращает все элементы в запросе REST, все равно появляется ошибка с дополнительным содержимым в конце документа, но я думаю, что это другой вопрос. - person funkmaster20th; 21.04.2015