Posted by: prankster March 1, 2011
IT -- Solutions Center[Forum]
Login in to Rate this Post:     0       ?        
BTW,
I wish to create an XML document in which one of its elements must be
defined with one of two known attributes, but not both.
 
For example, I would like to define a "socketHandler" element as follows:
 
<xs:element name="socketHandler">

    <xs:complexType>

        <xs:attribute name="hostName" type="xs:string"/>

        <xs:attribute name="hostAddress" type="xs:string"/>

        <xs:attribute name="port" type="xs:int" use="required"/>

    </xs:complexType>

</xs:element>


but I only want a user to be able to define either a hostName attribute
(e.g., hostName="<servername>") or a hostAddress (e.g.,
hostAddress="<IP_address>") attribute, but not both.  It appears that the
<xs:choice> construct accomplishes this for elements.  Is there a functional
equivalent for attributes, or is there a better way to approach this?


Does any one has better solution than following? I want to use W3C XML schema. I'm handling this in my code, but it would be awesome if i could use XML schema.

1) Change to a different schema dialect (I think RELAX-NG support this
functionality)
2) Express you co-constraint using an embedded schematron rule

In your example the latter could be expressed as the following Schematron rule
on your socketHandler element:

<xs:element name="socketHandler">
    <xs:annotation>
      <xs:appinfo>
        <sch:pattern  xmlns:sch="http://www.ascc.net/xml/schematron">
          <sch:rule context="socketHandler">
            <sch:report test="self::*[@hostName][@hostAddress]"
              > On a &lt;tag> element, if there is the attribute "attr", the
child element &lt;attr>  must be prohibited and vice versa.</sch:report>
          </sch:rule>
        </sch:pattern>
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
        <xs:attribute name="hostName" type="xs:string"/>
        <xs:attribute name="hostAddress" type="xs:string"/>
        <xs:attribute name="port" type="xs:int" use="required"/>
    </xs:complexType>
</xs:element>

These constraints can be validated with the new Schematron Validator from
Topologi. The tool is free and can be downloaded from www.topologi.com.

Thanks in advance 
Last edited: 01-Mar-11 01:23 PM
Read Full Discussion Thread for this article