CIS97 YT > Relax NG Projects > Catalog Grammar

Relax NG Projects
Catalog Grammar

Project Index | Documentation | Relax NG | Sample XML File

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

<start>
<element name="catalog">
    <element name="company">
        <text/>
    </element>
    <oneOrMore>
        <ref name="Department"/>
    </oneOrMore>
</element>
</start>

<define name="Department">
<element name="department">
    <attribute name="name"/>
    <attribute name="code">
        <data type="ID"/>
    </attribute>
    <oneOrMore>
        <ref name="Item"/>
    </oneOrMore>
</element>
</define>

<define name="Item">
<element name="item">
    <element name="name"><text/></element>
    <interleave>
        <element name="price">
            <attribute name="amt">
                <data type="double"/>
            </attribute>
            <optional>
                <attribute name="units">
                    <choice>
                        <value>USD</value>
                        <value>CDN</value>
                    </choice>
                </attribute>
            </optional>
        </element>
        <optional>
            <element name="manufacturer"><text/></element>
        </optional>
        <choice>
            <ref name="ColorList"/>
            <ref name="Color"/>
            <element name="sku">
                <ref name="sku_pattern"/>
            </element>
        </choice>
        <element name="summary">
            <ref name="XHTML_subset"/>
        </element>
        <optional>
            <element name="description">
                <ref name="XHTML_subset"/>
            </element>
        </optional>
    </interleave>
</element>
</define>

<define name="ColorList">
    <element name="color-list">
        <oneOrMore>
            <ref name="Color"/>
        </oneOrMore>
    </element>
</define>

<define name="Color">
    <element name="color">
        <text/>
        <attribute name="sku">
            <ref name="sku_pattern"/>
        </attribute>
        <optional>
            <attribute name="hex">
                <data type="string">
                    <param name="pattern">#[0-9a-fA-F]{6}</param>
                </data>
            </attribute>
        </optional>
    </element>
</define>

<define name="sku_pattern">
    <data type="string">
        <param name="pattern">[A-Z]{1,2}\d{3,4}(-[A-Za-z]{2})?</param>
    </data>
</define>

<define name="XHTML_subset">
    <zeroOrMore>
    <choice>
        <ref name="text_with_inline"/>
        <element name="p" ns="http://www.w3.org/1999/xhtml">
            <ref name="text_with_inline"/>
        </element>
        <element name="ul" ns="http://www.w3.org/1999/xhtml">
            <oneOrMore>
                <element name="li">
                    <ref name="XHTML_subset"/>
                </element>
            </oneOrMore>
        </element> 
        </choice>
    </zeroOrMore>
</define>

<define name="text_with_inline">
    <interleave>
        <text/>
        <zeroOrMore>
        <choice>
            <element name="strong" ns="http://www.w3.org/1999/xhtml">
                <ref name="text_with_inline"/>
            </element>
            <element name="em" ns="http://www.w3.org/1999/xhtml">
                <ref name="text_with_inline"/>
            </element>
        </choice>
        </zeroOrMore>
    </interleave>
</define>
</grammar>