[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [xml-dev] How to avoid the sequens of child elements in DTD, yet keep the cardinality?
Albena,
You can't as far as I know implement this in DTDs. However it is fairly
simple to implement in Schematron, with a grand total of four
assertions.
For more details of schematron see
http://www.ascc.net/xml/resource/schematron/schematron.html
Francis.
<sch:schema xmlns:sch="http://www.ascc.net/xml/schematron">
<sch:title>movies</sch:title>
<sch:pattern name="Header">
<sch:rule context="Header">
<sch:assert test="Identification"
>The Header must have one or more Identification
elements.</sch:assert>
<sch:assert test="Category"
>The Header must have one or more Category
elements.</sch:assert>
</sch:rule>
<sch:rule context="Header/*">
<sch:assert test="self::Identification or self::Category or
self::Weight or self::Keyword"
>Children of Header must be Identification, Category, Weight or
Keyword, but this was a <name/>.</sch:assert>
<sch:assert test="not(preceding::*[1][name() !=
name(current())][preceding::*[name() = name(current())]])"
>This <name/> was not grouped with the other
<name/>s.</sch:assert>
</sch:rule>
</sch:pattern>
</sch:schema>
---
C:\xml\schematron>sch-basic t-good.xml t
movies
C:\xml\schematron>sch-basic t-bad.xml t
movies
In pattern not(preceding::*[1][name() !=
name(current())][preceding::*[name() = name(current())]]):
This Keyword was not grouped with the other Keyword s.
---
Hope this helps -
Francis.
Albena Georgieva wrote:
>
> Hi there,
>
> I am creating a DTD document and I have difficulty to express
> that the element type Header:
>
> 1. must have one and only one child element of type Indentification
> 2. Can have [0 ... 1] Weight children elements
> 3. Must have at least one Category child element
> 4. Can have [0 ... n] Keywords
> 5. The order of the different children is not important
> 6. If there are several children of the same type, then they should be
> following each other
>
> Good example:
> <Header>
> <Keyword>Navratilova</Keyword>
> <Keyword>Tennis</Keyword>
> <Identification id="1111"/>
> <Category>Sports</Category>
> </Header>
> Another good example:
> <Header>
> <Category>Sports</Category>
> <Keyword>Navratilova</Keyword>
> <Keyword>Tennis</Keyword>
> <Identification id="1111"/>
> <Weight priority="3"/>
>
> </Header>
>
> Not accepted example
> <Header>
> <Category>Sports</Category>
> <Keyword>Navratilova</Keyword>
> <Identification id="1111"/>
> <Keyword>Tennis</Keyword>
> <Weight priority="3"/>
> </Header>
>
> I tried as follows:
>
> <!ELEMENT header (Identification| Weight? | Category+ | Keyword* )+>
> But then also this example becomes valid which is not what I am aiming to:
>
> <Header>
> <Category>Sports</Category>
> <Keyword>Navratilova</Keyword>
> <Keyword>Tennis</Keyword>
> <Identification id="1111"/>
> <Weight priority="3"/>
> <Category>Sports</Category>
> <Identification id="2222"/>
>
> </Header>
>
> And if I say so:
> <!ELEMENT header (Identification, Weight?, Category+, Keyword* )>
>
> It is better, but then we have to comply to the sequence of the children,
> which is what I want to avoid ...
> Any ideas, help please?
>
> I wish you all a very nice day!
> Greeting,
> Albena Georgieva
>
> -----------------------------------------------------------------
> The xml-dev list is sponsored by XML.org <http://www.xml.org>, an
> initiative of OASIS <http://www.oasis-open.org>
>
> The list archives are at http://lists.xml.org/archives/xml-dev/
>
> To subscribe or unsubscribe from this list use the subscription
> manager: <http://lists.xml.org/ob/adm.pl>