[Date Prev]
| [Thread Prev]
| [Thread Next]
| [Date Next]
--
[Date Index]
| [Thread Index]
Re: [xml-dev] Use xsd to specify multiple instances of existing element
- From: "Andrew Welch" <andrew.j.welch@gmail.com>
- To: "Rick Jelliffe" <rjelliffe@allette.com.au>
- Date: Mon, 22 Sep 2008 10:58:51 +0100
> So in order to get your constraint you have three choices:
>
> 1) Adopt RELAX NG instead of XSD.
> 2) Adopt Schematron as well as (or instead of XSD)
> 3) Adopt XSD 1.1 (if you can find an implementation) and use their
> assertions.
there's a 4th I think:
4) annotate the category elements with an xsi:type:
<category xsi:type="privacy" scheme='http://dig.com/privacy' term='private'/>
<category xsi:type="fishingType" scheme='http://dig.com/fishingType'
term='coarse'/>
...then just define the types "privacy" and "fishingType" in your
schema. This will work with 1.0 but depending on your situation could
be a pain to set the xsi:type on the elements (moving entirely to
Relax or using XSD+Schematron could be considered a bigger pain). On
the positive side, when you switch to 1.1 you can drop the xsi:type
attributes and then switch between alternative type definitions based
on the value of the term attribute... (seperate type definitions are
better than assertions I think) The XSD processor from Saxonica
implements the current 1.1 spec so you could just start using that
now.
> In the case of the XSD 1.1, I think the assertions will have to be
> constraints on the <entry> element, for example
> <xsd:assert test="category[1]/@term='open' or category[1]/@term='private'
> "/>
> ********* <xsd:assert test="category[2]/@term='coarse' or
> category[2]/@term='open' "/>
>
just to be a pedant you can do:
<xsd:assert test="category[1]/@term = ('open', 'private')"/>
<xsd:assert test="category[2]/@term = ('coarse', 'open') "/>
...which is a little nicer.
--
Andrew Welch
http://andrewjwelch.com
Kernow: http://kernowforsaxon.sf.net/
[Date Prev]
| [Thread Prev]
| [Thread Next]
| [Date Next]
--
[Date Index]
| [Thread Index]