Animal-friends implemented as a pattern (Re: XML-Data: advantages over DTD syntax?)
Rick Jelliffe
ricko at allette.com.au
Mon Sep 29 21:03:11 BST 1997
> From: Jonathan Robie <jwrobie at mindspring.com>
> <xml:schema>
> <elementType id="animalFriends">
> <elt href="#pet" occurs="PLUS"/>
> </elementType>
>
> <elementType id="pet">
> <any/>
> <attribute id='name'/>
> <attribute id='owner'/>
> </elementType>
>
> <elementType id="cat" extends="#pet"/>
> <elt href='#kittens'/>
> <attribute id='lives' type='NMTOKEN'/>
> </elementType>
>
> <elementType id="dog" extends="#pet"/>
> <elt href='#puppies'/>
> <attribute id='breed'/>
> </elementType>
> <xml:schema>
>
> Now I can use this type declaration to create an animalFriends element,
> which is a list of pets:
>
> <animalFriends>
> <cat name="Fluffy" lives='9'/>
> <pet name="Diego"/>
> <dog name="Gromit" owner='Wallace' breed='mutt'/>
> </animalFriends>
>
> So the pet hrefs can point to pets, cats, or dogs.
>
> How would I create this schema using architectural forms?
And you do not even need architectural forms. Here is a very
simple pattern for doing everything your example does using
a single DTD and standard SGML! (The suffixes "-content"
and "-attributes" are reserved for use in patterns. The
attribute "is-a" is reserved to allow inheritence labelling.)
<!DOCTYPE animal-friends
[
<!-- Handle animal friends ================================= -->
<!ENTITY % animal-friends-content
" ( pet | cat | dog )+")
<!ENTITY % animal-friends-attributes
" ">
<!ELEMENT animal-friends
( %animal-friends-content; )>
<!ATTLIST animal-friends
%animal-friends-attributes;
>
<!-- Handle pets =========================================== -->
<!ENTITY % pet-content
"ANY" >
<!ENTITY % pet-attributes
" name ID #IMPLIED
owner ID #IMPLIED
is-a CDATA #FIXED 'pet' " > <!-- does not handle multiple inheritance! -->
<!ELEMENT pet
( %pet-content; ) >
<!ATTLIST pet
%pet-attributes;
>
<!-- Handle cats =========================================== -->
<!ENTITY % cat-contents
( " (kittens)? " )
<!ENTITY % cat-attributes
" lives NMTOKEN #IMPLIED ">
<!ELEMENT cat
( %pet-content;, %cat-contents; )
<!ATTLIST cat
%pet-attributes;
%cat-attributes;
>
<!-- Handle dogs =========================================== -->
<!ENTITY % dog-contents
( " (puppies)? " )
<!ENTITY % dog-attributes
" breed CDATA #IMPLIED ">
<!ELEMENT dog
( %pet-content;, %dog-contents; )
<!ATTLIST dog
%pet-attributes;
%dog-attributes;
>
]>
<animalFriends>
<cat name="Fluffy" lives='9'/>
<pet name="Diego"/>
<dog name="Gromit" owner='Wallace' breed='mutt'/>
</animalFriends>
If you want multiple inhereitance, then you can just
define a different suffix, and search through attributes
based on that to collect the inheritance tree. I can
provide an example if anyone is interested.
Anyone who is aware of the pattern can see this and implement
it just as easily as they could using XML-data's syntax,
but without breaking SGML compatibility, which generating
new element types outside declarations does.
Rick Jelliffe
xml-dev: A list for W3C XML Developers. To post, mailto:xml-dev at ic.ac.uk
Archived as: http://www.lists.ic.ac.uk/hypermail/xml-dev/
To (un)subscribe, mailto:majordomo at ic.ac.uk the following message;
(un)subscribe xml-dev
To subscribe to the digests, mailto:majordomo at ic.ac.uk the following message;
subscribe xml-dev-digest
List coordinator, Henry Rzepa (mailto:rzepa at ic.ac.uk)
More information about the Xml-dev
mailing list