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!

_______________________________________________
oXygen-user mailing list
oXygen-user@oxygenxml.com
http://www.oxygenxml.com/mailman/listinfo/oxygen-user

Reply via email to