Typed "href" and traversal across "href"

Most of the current XML processing (such as XPATH processing, schema 
validation), cannot traverse across an "href".  Like the following, I won't 
get the string if I use the XPATH expression "/Root/A/AA/BB".

<Root>
     <A>
         <AA href="0001" />
     </A>
     <B id="0001">
         <BB>I am here</BB>
     </B>
</Root>

The XML schema of this document will be ...

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema>
         <xsd:element name="ROOT">
                 <xsd:complexType>
                         <xsd:sequence>
                                 <xsd:element name="A" type="A-Type"/>
                                 <xsd:element name="B" type="B-Type"/>
                         </xsd:sequence>
                 </xsd:complexType>
         </xsd:element>
         <xsd:complexType name="A-Type">
                 <xsd:sequence>
                         <xsd:element name="AA">
                                 <xsd:complexType>
                                         <xsd:attribute name="href" 
type="xsd:IDREF"/>
                                 </xsd:complexType>
                         </xsd:element>
                 </xsd:sequence>
         </xsd:complexType>
         <xsd:complexType name="B-Type">
                 <xsd:sequence>
                         <xsd:element name="BB" type="xsd:string"/>
                 </xsd:sequence>
                 <xsd:attribute name="id" type="xsd:ID" use="required"/>
         </xsd:complexType>
</xsd:schema>


The major reason why the XML processing cannot traverse across an href is 
because the type information about the href is missing.  I guess if we 
provide that type information to the href, then traverse across a reference 
will be possible.  Think about this new schema (I have highlighted the 
difference from the previous one)

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema>
         <xsd:element name="ROOT">
                 <xsd:complexType>
                         <xsd:sequence>
                                 <xsd:element name="A" type="A-Type"/>
                                 <xsd:element name="B" type="B-Type"/>
                         </xsd:sequence>
                 </xsd:complexType>
         </xsd:element>
         <xsd:complexType name="A-Type">
                 <xsd:sequence>
<!-- 
************************************************************************************ 
-->
                         <xsd:reference name="AA" type="B-Type"/>
<!-- 
************************************************************************************ 
-->
                 </xsd:sequence>
         </xsd:complexType>
         <xsd:complexType name="B-Type">
                 <xsd:sequence>
                         <xsd:element name="BB" type="xsd:string"/>
                 </xsd:sequence>
                 <xsd:attribute name="id" type="xsd:ID" use="required"/>
         </xsd:complexType>
</xsd:schema>


To illustrate why I need this.  Lets look at the web service SOAP encoding.

In WSDL, every complex type is described in XML-Schema.  So if you have a 
"Customer" who has an "Address", the XML schema will look as the following ...

<complexType name="Customer">
         <sequence>
                 <element name="name" type="xsd:string"/>
                 <element name="addr" type="tns:Address"/>
         </sequence>
</complexType>

<complexType name="Address">
         <sequence>
                 <element name="street" type="xsd:string"/>
                 <element name="city" type="xsd:string"/>
         </sequence>
</complexType>


However, if you pass a "Customer" object as a parameter in a SOAP request, 
the "soap-encoding" will encode the parameter into ...

<multiRef id="id0" xsi:type="Customer">
         <name>....</name>
         <addr href="#id1"/>
</multiRef>
<multiRef id="id1" xsi:type="Address">
         <street>....</street>
         <city>....</city>
</multiRef>


Therefore, the XML after encoding is using a "href" but the WSDL is saying 
that the Address should be embedded into the Customer.  So it seems SOAP 
encoding and WSDL is inconsistent.

It seems to me there is a fundamental mismatch between XML schema and SOAP 
encoding.  XML schema does have a very limited concept of reference 
(id/idref is typeless), complex object will mainly be embedded into another 
complex object.  However, SOAP encoding almost use reference 
exclusively.  Complex object will has a "href" into another complex object.

It seems to me that the problem can be solved if we ....
1) Add a "typed reference" concept in XML-schema.
2) Schema validation can traverse across the "href"

Best regards,
Ricky

Received on Friday, 6 September 2002 15:41:09 UTC