Разбор xml-файла с xpath и xquery с использованием eXist-db
Мне нужно получить <TITLE>
элемент из следующего XML с использованием XQuery (я использую eXist-db).
<?xml-stylesheet href="shakes.xsl" type="text/xsl"?>
<!--!DOCTYPE PLAY PUBLIC "-//PLAY//EN" "play.dtd"-->
<ClinicalDocument xmlns="urn:hl7-org:v3">
<PLAY>
<TITLE>The Tragedy of Hamlet, Prince of Denmark</TITLE>
</PLAY>
</ClinicalDocument >
Когда я пытаюсь использовать XQuery ниже, я не получаю ожидаемый результат.
xquery version "3.0";
doc("/db/apps/demo/data/hamlet.xml")/ClinicalDocument/PLAY/TITLE
Я думаю, что проблема связана с xmlns
атрибут присутствует в <ClinicalDocument>
тег:
<ClinicalDocument xmlns="urn:hl7-org:v3">
Как я могу изменить свой XQuery для получения нужного элемента XML?
2 ответа
Объявите префикс, который сопоставлен с вашим пространством имен XML по умолчанию, и используйте этот префикс для ссылки на элементы в пространстве имен, что-то вроде этого:
declare namespace d = "urn:hl7-org:v3";
doc("/db/apps/demo/data/hamlet.xml")/d:ClinicalDocument/d:PLAY/d:TITLE
протестировано здесь: http://www.xpathtester.com/xquery/a88f300bbeacdbd846d7aec887d48a0b
Для любого пространства имен вы можете использовать подстановочный знак * вместо префикса пространства имен.
Так что если вы просто хотите текст заголовка, вы можете сделать:
doc("/db/apps/demo/data/hamlet.xml")/*:ClinicalDocument/*:PLAY/*:TITLE/text()
Больше нет необходимости определять пространство имен. (Хотя вы обнаружите, что наличие определенной схемы с пространством имен делает работу с XQuery намного приятнее в долгосрочной перспективе.)