PDA

View Full Version : Referencing an element across <import ...>'s



MatthewRed
22 Sep 2006, 03:24 PM
I have a first schema with a unique targetNamespace, a default namespace that of "http://www.w3.org/2001/XMLSchema", and a global element "<element name="X"/>".

The purpose of the first schema is simply to define some base element types. It's imported by a bunch of other schemas.

I have a second schema, it too has a unique targetNamespace and a default namespace of "http://www.w3.org/2001/XMLSchema" that imports the first and its namespace. I also have a prefix qualified with the first schema's targetNamespace. Within the second, I reference X "<element ref="first:X"/>".

The purpose of the second is to define types that are much more specific to a job. It too is imported by a bunch of schemas that are like the third described below.

I have a third schema, which does this all again, and my xml file is validated against this. The purpose of this third is to describe elements specific to the xml file and more importantly the STRUCTURE of the root element of the xml file.

I didn't choose this hierarchy, thats how it is in the production code.

My problem is that this doesn't verify. The second schema gets the error message about the first: "Message: Element must have a name or a ref attribute - element ignored". Did I qualify the reference wrong? Can anyone see the problem with my logic? Here are the example files:

Three.xml--
<?xml version="1.0" encoding="UTF-8"?>
<Three_Root xmlns="http://www.company.com/Three.xsd"
targetNamespace="http://www.company.com/Three.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.company.com/Three.xsd Three.xsd">
<X>7</X>
</Three_Root>

Three.xsd--
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:Three_ns="http://www.company.com/Three.xsd"
xmlns:Two_ns="http://www.company.com/Two.xsd"
targetNamespace="http://www.company.com/Three.xsd">

<import schemaLocation="Two.xsd" namespace="http://www.company.com/Two.xsd"/>

<element name="Three_Root">
<complexType>
<sequence>
<element ref="Two_ns:X"/>
</sequence>
</complexType>
</element>

</schema>

Two.xsd--
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:Two_ns="http://www.company.com/Two.xsd"
xmlns:One_ns="http://www.company.com/One.xsd"
targetNamespace="http://www.company.com/Two.xsd">

<import schemaLocation="One.xsd" namespace="http://www.company.com/One.xsd"/>

<element ref="One_ns:X"/>

</schema>

One.xsd--
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:One_ns="http://www.company.com/One.xsd"
targetNamespace="http://www.company.com/One.xsd">

<element name="X" type="integer"/>

</schema>