Lists Home |
Date Index |
From: "Brian Burridge" <email@example.com>
> I have an xml document, where we want elements to be able to appear in
> any order. Some are required, others aren't. And in many cases if you
> have tag A then you don't need tag B, and vice versa.
> Problem is, I need to use the ALL tag and have choices and groups within
> it, but you can't.
If you have choices and groups, then how can you need the ALL tag?
If you really need the strong constraints, you may have to just make an
enormous content model.
P.S. If you want to do this kind of thing using Schematron (or some mix
of XML Schemas and Schematron) you can use the following idioms
<assert test="count(x) + count(y) + count(z) = count(*)">
myElement can only contain the elements x,y,z <!-- n.b. in any order-->
myElement must contain at least one x <!-- n.b. anywhere -->
myElement must contain a single y <!-- n.b. anywhere -->
<assert test="count(z) = count(z[previous-sibling::y])">
a z element can only follow a y
Grammars allow exquisite modelling of sequence, at the cost that
they generally are weak when sequence is only occasionally
important in a content model. XPath-based constraint languages
(such as Schematron) are strong for that, but are weaker (or, at least,
more verbose) when elements re-appear in content models with different
However, complex content models are usually either a sign of a missing
element, or that there is some simple constraint required that cannot
be well expressed by a regular expression. In the latter case, it is
better engineering to express the constraint more directly, using explicit
rules rather than simulate them using a grammar.