Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

xQuery on XML file with namespace

I'm using eXist-DB to store XML documents. Here's a sample XML file with the namespace info:

<?xml version="1.0" encoding="utf-8"?>
<ClinicalDocument xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                  xmlns="urn:hl7-org:v3">
            <name>
                <family>Smith</family>
                <middle>Blade</middle>
                <first>John</first>
            </name>
            <name>
                <family>Frost</family>
                <middle>Bill</middle>
                <first>Conrad</first>
            </name>
</ClinicalDocument>

The query is :

declare namespace xsd = "http://www.w3.org/2001/XMLSchema";
declare namespace xsi = "http://www.w3.org/2001/XMLSchema-instance";

for $x in doc("/db/HL7/cda2.xml")/ClinicalDocument/name
return $x/family

I tried to declare the third namespace within the query but it doesn't seem to work.

like image 564
jwesonga Avatar asked Mar 10 '11 14:03

jwesonga


1 Answers

The third namespace attribute (xmlns="urn:hl7-org:v3") binds the default namespace.

The syntax to define the default namespace for elements in XQuery is:

declare default element namespace "urn:hl7-org:v3";

However, redefining the default element namespace prevents your query from testing for nodes with no namespace!

A better way to do this is perhaps to bind a new prefix to this namespace:

declare namespace xsd = "http://www.w3.org/2001/XMLSchema";
declare namespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
declare namespace h17 = "urn:h17-org:v3";

for $x in doc("/db/HL7/cda2.xml")/h17:ClinicalDocument/h17:name
return $x/h17:family
like image 50
Oliver Hallam Avatar answered Sep 21 '22 17:09

Oliver Hallam