Re: Self reference in an element

Mukul Gandhi <[email protected]>
Newsgroups gmane.text.xml.schema.devel
Message-ID <CABuuzNOZmGGQ5Z4410Cn6yZwSw4Kmpxy+P_CQBdWCyZuEZ-B-g@mail.gmail.com>
Including the "dept" structure recursively within itself, looks a bit
inefficient to me.

I think you want your schema to say that, a "dept" can include other
departments. Since you already have the attribute "num" on "dept", you
can used XSD identity-constraints to enforce uniqueness and
referential integrity for department numbers (i.e @num).

I would propose a schema like following for this use case:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="Organization">
	   <xs:complexType>
	         <xs:sequence>
		      <xs:element name="dept" type="Department" maxOccurs="unbounded"/>
		 </xs:sequence>
	   </xs:complexType>
	   <xs:key name="dept_key">
	         <xs:selector xpath="dept"/>
		 <xs:field xpath="@num"/>
	   </xs:key>
	   <xs:keyref name="prnt_dept_ref" refer="dept_key">
	         <xs:selector xpath="dept"/>
		 <xs:field xpath="parent"/>
	   </xs:keyref>
     </xs:element>
	
     <xs:complexType name="Department">
	   <xs:sequence>
		  <xs:element name="name" type="xs:string"/>
		  <xs:element name="total_emp" type="xs:positiveInteger"/>
		  <xs:element name="parent" type="xs:string" minOccurs="0"/>
	   </xs:sequence>
	   <xs:attribute name="num" type="xs:string"/>
    </xs:complexType>
	
</xs:schema>


A sample instance for this schema is following,

<Organization>
     <dept num="d1">   <!-- this "dept" doesn't have a parent department -->
          <name>dept 1</name>
	  <total_emp>5</total_emp>
     </dept>
     <dept num="d2">
          <name>dept 2</name>
	  <total_emp>8</total_emp>
	  <parent>d1</parent>
     </dept>
     <dept num="d3">
         <name>dept 3</name>
	 <total_emp>15</total_emp>
	 <parent>d1</parent>
     </dept>
     <dept num="d4">
         <name>dept 4</name>
	 <total_emp>7</total_emp>
	 <parent>d2</parent>
     </dept>
</Organization>

I hope this helps.

On Tue, Jul 12, 2011 at 11:50 AM, Avinash Nagabhushan
<[email protected]> wrote:
> Hi Sir,
>
>       I am writing an schema for the following structure:
>
> Organization
>    dept +
>        @num
>        name
>        total_emp
>        dept +
> where dept elements are nested within another dept element, but all
> departments are under organization.
>
>
> My Schema is:
>
>
> <xs:schema xmlns:ns1="http://www.ns1.com"
> xmlns:xs="http://www.w3.org/2001/XMLSchema"
> targetNamespace="http://www.ns1.com">
>        <xs:element name="Organization">
>                <xs:complexType>
>                        <xs:sequence>
>                                <xs:element name="Department" maxOccurs="unbounded">
>                                        <xs:complexType>
>                                                <xs:sequence>
>                                                        <xs:element name="Name"/>
>                                                        <xs:element name="TotalEmp"/>
>                                                        <xs:element ref="ns1:Department" minOccurs="0" maxOccurs="unbounded"/>
>                                                </xs:sequence>
>                                                <xs:attribute name="num" type="xs:string"/>
>                                        </xs:complexType>
>                                </xs:element>
>                        </xs:sequence>
>                </xs:complexType>
>        </xs:element>
> </xs:schema>
>
>
> There is a validation error saying "ns1:Department" is not a QName and
> cannot find declaration for the same. Is there something wrong in my
> definition?
>
>
> Can you please let me know whether it is a correct approach or wrong?
>
>
> Thanks,
>
> Avinash K N





-- 
Regards,
Mukul Gandhi
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.