[oXygen-user] XML Schema question

Sorin Ristache
Wed Jul 11 09:09:46 CDT 2007


Hello,

This is a co-occurrance constraint and cannot be enforced in XML Schema. 
You need a Schematron constraint which restricts the presence of 
MyElement3 based on the value of the scope attribute:

   <xsd:element name="MyElement1">
       <xsd:annotation>
           <xsd:appinfo>
               <pattern xmlns="http://purl.oclc.org/dsdl/schematron" 
name="Check MyElement3 with scope attr">
                   <rule context="MyElement1">
                       <assert test="(MyElement3 and @scope = 'scope2') 
or not(MyElement3)">MyElement3 is allowed only if
                       @scope is 'scope2'.</assert>
                   </rule>
               </pattern>
           </xsd:appinfo>
       </xsd:annotation>
       <xsd:complexType>
           <xsd:sequence>
               <xsd:element name="Description" minOccurs="0" 
type="xsd:string"/>
               <xsd:element maxOccurs="unbounded" ref="MyElement2"/>
               <xsd:element minOccurs="0" maxOccurs="unbounded" 
ref="MyElement3"/>
               <xsd:element maxOccurs="unbounded" ref="MyElement4"/>
           </xsd:sequence>
           <xsd:attribute name="scope" use="required">
               <xsd:simpleType>
                   <xsd:restriction base="xsd:string">
                       <xsd:enumeration value="scope1"/>
                       <xsd:enumeration value="scope2"/>
                       <xsd:enumeration value="scope3"/>
                       <xsd:enumeration value="scope4"/>
                   </xsd:restriction>
               </xsd:simpleType>
           </xsd:attribute>
       </xsd:complexType>
   </xsd:element>

In the XML instances you need to specify that the XML Schema contains 
Schematron constraints, that is insert at the beginning of the XML 
instance a processing instruction like:

<?oxygen SCHSchema="path/to/schemaWithCOConstraint.xsd"?>

This processig instruction is inserted automatically if you associate 
the schema with the XML instance using the Associate Schema action 
available on the Document toolbar and also on the Document -> XML 
Document menu.


Regards,
Sorin


Timothy Reaves wrote:
>      I have an XML Schema I'm trying to lock down (to do more validation
> for me).  I have an element with a required attribute that I restrict
> as shown below.
> 
> <xsd:element name="MyElement1">
>   <xsd:complexType>
>     <xsd:sequence>
>       <xsd:element name="Description" minOccurs="0" type="xsd:string"/>
>       <xsd:element maxOccurs="unbounded" ref="MyElement2"/>
>       <xsd:element maxOccurs="unbounded" ref="MyElement3"/>
>       <xsd:element maxOccurs="unbounded" ref="MyElement4"/>
>     </xsd:sequence>
>     <xsd:attribute name="scope" use="required">
>       <xsd:simpleType>
>         <xsd:restriction base="xsd:string">
>           <xsd:enumeration value="scope1"/>
>           <xsd:enumeration value="scope2"/>
>           <xsd:enumeration value="scope3"/>
>           <xsd:enumeration value="scope4"/>
>         </xsd:restriction>
>       </xsd:simpleType>
>     </xsd:attribute>
>   </xsd:complexType>
> </xsd:element>
> 
> 
> What I want to do is have MyElement3 only allowable in a MyElement1 where
> scope == scope2 (for example).  So have a rule on an element that
> restricts what element can contain it based on the attribute value.
> 
>      Is this possible?  Any pointer to documentation doing something like
> this?  Thanks!




More information about the oXygen-user mailing list