<book>The Mill on the Floss</book>
</
<book author="Eliot">. . .</book>
<!ELEMENT book (title, subTitle?, author+)> <!ATTLIST book volumes NMTOKEN #IMPLIED inPrint (true|false) #REQUIRED>
<xs:element name="book" type="my:publType"> <xs:complexType name="publType"> <xs:sequence> <xs:element ref="my:title" minOccurs="0"> . . .
(wb)*w?
?
, +
and
*
, but qualitatively different
(a^{1..2},b^{?})^{2}
<xs:all>
))min-
and maxOccurs
maxOccurs
is
unbounded
vs. when it's numeric.
unbounded
, we start with the published
conversion:maxOccurs
is numeric, we start with a chain of
maxOccurs-minOccurs
term machines, with a
judicious use of lambda. For example for maxOccurs-minOccurs=2
:minOccurs>0
, we add a further,
non-optional, chain of minOccurs
term machines at the front.d
variables are in the tree to be validated, the
g
variables are in the grammar components.
We write d in g if forest d matches group g.
Empty:
e in e
Sequence:
d_{1} in g_{1} _{ } d_{2} in g_{2}
d_{1} , d_{2} in g_{1} , g_{2}
Choice 1:
d in g_{1}
d in g_{1} | g_{2}
Choice 2:
d in g_{2}
d in g_{1} | g_{2}
Interleave:
d |?_{inter} d'_{1};d"_{2} d_{1} in g_{1 } d_{2} in g_{2}
d in g_{1} & g_{2}
Putting the above notations together, here is an example of an inference rule that occurs later in this document:
statEnv |- Expr_{1} : Type_{1} statEnv |- Expr_{2} : Type_{2}
statEnv |- Expr_{1} , Expr_{2} : Type_{1}, Type_{2}
This rule is read as follows: if two expressions Expr_{1} and Expr_{2} are known to have the static types types Type_{1} and Type_{2} (the two premises above the line), then it is the case that the expression below the line "Expr_{1} , Expr_{2}" must have the static type "Type_{1}, Type_{2}", which is the sequence of types Type_{1} and Type_{2}.
- old
- Two distinct attribute declarations in the {attribute uses} must not have identical {name}s and {target namespace}s.
- new
- ∀ a1, a2 ∈ C∙attribute uses ,
(a1∙name = a2∙name ∧ a1∙target namespace = a2∙target namespace) ⇒ a1 = a2Only one attribute declaration per qualified name.