Value-equals test required
Value-equals test required (a co-constraint use case)
Allow one attribute to be required if the value of another attribute is a particular named value; otherwise forbidden.
Cf. Attribute mutex and Simple attribute implication (which make the required/optional/forbidden status of one attribute depend on the presence or absence, rather than the value, of the other attribute).
Source: [1]
Other use cases: Co-constraint Use Cases
Description
Does XML handle conditional structure? In otherwords, can the use of a type be conditional? Please see the following example.
<xsd:complexType name="BindType">
<xsd:attribute name="type" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="BridgedEthernet"/>
<xsd:enumeration value="PPPOE"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<!-- the following item is required if value of above attribute "type"
is "BridgeEthernet" : can this be done ???? -->
<xsd:attribute name="BrEthernetIP" use="optional">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="7"/>
<xsd:maxLength value="16"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
Analysis
FV
This is a value-based condition on an Attribute generating an upgrade of another attribute. Axis is attribute.
| CoConstraintDimensionSource: |
| CoConstraintDimensionDestination: |
| CoConstraintDimensionType: |
| CoConstraintDimensionEffect: |
| CoConstraintDimensionAxis: |
Possible solutions
Relax NG
Schematron
Check clause
One solution (proposal 1) is to add this annotation to the complex type.
<xsd:annotation>
<xsd:appinfo>
<sch:pattern>
<sch:rule>
<sch:report
test="@type='BridgeEthernet' & @BrEthernetIP = ''">
If BindType/@type is 'BridgeEthernet', then a value is required
for the BrEthernetIP attribute.
</sch:report>
</sch:rule>
</sch:pattern>
</xsd:appinfo>
</xsd:annotation>
Another (proposal 2) would be to include the sch:report element directly in the complex type definition.
Note that to the extent that the user conceives of this as a constraint on the BrEthernetIP attribute, any expression as a constraint on the containing complex type will feel misplaced.
SchemaPath
One of the possible solutions is:
<xsd:element name="Bind">
<xsd:alt cond="./@type='BridgedEthernet'" type="TBridged"/>
<xsd:alt type="TPPPOE"/>
</xsd:element>
<xsd:complexType name="TBridged">
<xsd:attribute name="type" use="required" type="xsd:NMTOKEN" fixed="BridgedEthernet">
<xsd:attribute name="BrEthernetIP" use="required" type="SevenSixteen"/>
</xsd:complexType>
<xsd:complexType name="TPPPOE">
<xsd:attribute name="type" use="required" type="xsd:NMTOKEN" fixed="PPPOE">
</xsd:complexType>
<xsd:simpleType name="SevenSixteen">
<xsd:restriction base="xsd:string">
<xsd:minLength value="7"/>
<xsd:maxLength value="16"/>
</xsd:restriction>
</xsd:simpleType>
and another is:
<xsd:element name="Bind">
<xsd:alt cond="./@type='BridgedEthernet' and not ./@BrEthernetIP" type="xsd:error"/>
<xsd:alt type="BindType">
</xsd:element>
<xsd:complexType name="BindType">
<xsd:attribute name="type" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="BridgedEthernet"/>
<xsd:enumeration value="PPPOE"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="BrEthernetIP" use="optional">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="7"/>
<xsd:maxLength value="16"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
Conditional Type
Inventing a syntax:
<xsd:complexType name="BindType">
<xsd:alt cond="./@type='BridgedEthernet'">
<xsd:attribute name="type" use="required" type="xsd:NMTOKEN" fixed="BridgedEthernet"/>
<xsd:attribute name="BrEthernetIP" use="optional" type="SevenSixteen"/>
</xsd:alt>
<xsd:alt>
<xsd:attribute name="type" use="required" type="xsd:NMTOKEN" fixed="PPPOE"/>
</xsd:alt>
</xsd:complexType>
<xsd:simpleType name="SevenSixteen">
<xsd:restriction base="xsd:string">
<xsd:minLength value="7"/>
<xsd:maxLength value="16"/>
</xsd:restriction>
</xsd:simpleType>