[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