- From: Ricky Ho <riho@cisco.com>
- Date: Fri, 06 Sep 2002 12:40:35 -0700
- To: www-xml-schema-comments@w3.org
- Message-Id: <4.3.2.7.2.20020906120436.0273eb50@franklin.cisco.com>
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