ZVON > Tutorials > XML Schema and Relax NG Tutorial
Index | >> Example 7 / 10 << | Prev | Next |
Contents > Simple types > Defining a group of attributes

Defining a group of attributes

  1. XML Schema
  2. Relax NG
XML Schema keys: attributeGroup
Relax NG keys: attribute

1. XML Schema

Let's say we want to define a group of common attributes, which will be reused. The root element is named "root", it must contain the "aaa" and "bbb" elements, and these elements must have attributes "x" and "y".

Valid document


<root xsi:noNamespaceSchemaLocation="correct_0.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <aaa x="1" y="2"/>
  <bbb x="3" y="4"/>
</root>

Invalid document
Attribute "x" is missing.


<root xsi:noNamespaceSchemaLocation="correct_0.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <aaa y="2"/>
  <bbb x="3" y="4"/>
</root>

Invalid document
Attribute "z" is not allowed.


<root xsi:noNamespaceSchemaLocation="correct_0.xsd" xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <aaa x="1" y="2" z="2"/>
  <bbb x="3" y="4"/>
</root>

Correct XML Schema (correct_0.xsd)
Do not forget to add the attribute "use" set to "required" when declaring attribute (default value is "optional").


<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" >

  <xsd:element name="root">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="aaa" minOccurs="1" maxOccurs="1">
          <xsd:complexType>
            <xsd:attributeGroup ref="myAttrs"/>
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="bbb" minOccurs="1" maxOccurs="1">
          <xsd:complexType>
            <xsd:attributeGroup ref="myAttrs"/>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:attributeGroup name="myAttrs">
    <xsd:attribute name="x" type="xsd:integer" use="required"/>
    <xsd:attribute name="y" type="xsd:integer" use="required"/>
  </xsd:attributeGroup>
</xsd:schema>

2. Relax NG

Relax NG is not so discriminating when it comes to differences between elements and attributes :-). The default behaviour of Relax NG is as follows: if you do not specify explicitly that the use should be optional, it's implicitly required.

Valid document


<root xmlns="">
  <aaa x="1" y="2"/>
  <bbb x="3" y="4"/>
</root>

Invalid document
Attribute "x" is missing.


<root xmlns="">
  <aaa y="2"/>
  <bbb x="3" y="4"/>
</root>

Invalid document
Attribute "z" is not allowed.


<root xmlns="">
  <aaa x="1" y="2" z="2"/>
  <bbb x="3" y="4"/>
</root>

Correct Relax NG schema (correctRelax_0.rng)


<grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" xmlns="http://relaxng.org/ns/structure/1.0" >

  <start>
    <element>
      <name ns="">root</name>
      <element name="aaa">
        <ref name="myAttrs"/>
        <text/>
      </element>
      <element name="bbb">
        <ref name="myAttrs"/>
        <text/>
      </element>
    </element>
  </start>

  <define name="myAttrs">
    <attribute name="x">
      <data type="integer"/>
    </attribute>
    <attribute name="y">
      <data type="integer"/>
    </attribute>
  </define>
</grammar>