Разбор 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 намного приятнее в долгосрочной перспективе.)

Другие вопросы по тегам