[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]
Subject: Convention for mimicking inheritance in RELAX NG
In my talk at Extreme, I argued that inheritance can be mimicked in
RELAX NG by using a simple convention.
I used the attached example in my talk. I am going to send this to GCA
soon.
1) Schema mimicking a class hierarchy
<?xml version="1.0"?>
<grammar xmlns="http://relaxng.org/ns/structure/0.9"
xmlns:a="http://relaxng.org/ns/annotation/0.9"
xmlns:xsd="http://www.w3.org/2001/XMLSchema-datatypes"
ns="http://www.xml.gr.jp/xmlns/ex">
<start>
<element name="schemaLanguage">
<optional>
<element name="mascot">
<ref name="referenceToAnimal"/>
</element>
</optional>
<element name="specifications">
<list>
<zeroOrMore>
<data type="string"/>
</zeroOrMore>
</list>
</element>
</element>
</start>
<div>
<a:documentation>Abstract superclass: animal</a:documentation>
<define name="referenceToAnimal"><notAllowed/></define>
<define name="animal"><empty/></define>
</div>
<div>
<a:documentation>Abstract superclass: mamal</a:documentation>
<define name="referenceToAnimal" combine="choice">
<ref name="referenceToMamal"/>
</define>
<define name="referenceToMamal"><notAllowed/></define>
<define name="mamal"><ref name="animal"/><empty/></define>
</div>
<div>
<a:documentation>Concrete class: cat</a:documentation>
<define name="referenceToMamal" combine="choice">
<ref name="referenceToCat"/>
</define>
<define name="referenceToCat">
<attribute name="type">
<value>cat</value>
</attribute>
<ref name="cat"/>
</define>
<define name="cat">
<ref name="mamal"/>
<optional>
<attribute name="color"/>
</optional>
</define>
</div>
<div>
<a:documentation>Concrete class: fortuneCat</a:documentation>
<define name="referenceToCat" combine="choice">
<ref name="referenceToFortuneCat"/>
</define>
<define name="referenceToFortuneCat">
<attribute name="type">
<value>fortuneCat</value>
</attribute>
<ref name="fortuneCat"/>
</define>
<define name="fortuneCat">
<ref name="cat"/>
<attribute name="raisedPaw">
<a:documentation>
right: inviting money
</a:documentation>
<a:documentation>
left: inviting people
</a:documentation>
<choice>
<value>right</value>
<value>left</value>
</choice>
</attribute>
</define>
</div>
</grammar>
2) a valid instance
<schemaLanguage xmlns="http://www.xml.gr.jp/xmlns/ex">
<mascot type="cat" color="white"/>
<specifications/>
</schemaLanguage>
3) another valid instance
<schemaLanguage xmlns="http://www.xml.gr.jp/xmlns/ex">
<mascot type="fortuneCat" raisedPaw="left" color="white"/>
<specifications/>
</schemaLanguage>
Cheers,
Makoto
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [Elist Home]
Powered by eList eXpress LLC