[Home] [By Thread] [By Date] [Recent Entries]
Hi Folks,
Consider the following XML document. There are two <Attitude> elements; one has a "units" attribute:
<Test>
<Altitude units="feet" />
<Altitude />
</Test>
I want a Schematron rule that expresses this:
The <Test> element must have only
one child <Altitude> element with a
units="feet" attribute.
So you write this Schematron rule:
<sch:rule context="Test">
<sch:assert test="not(Altitude[@units eq 'feet'][2])">
There is exactly one Altitude child
element with a units="feet" attribute.
</sch:assert>
</sch:rule>
The rule fires, the assertion succeeds, and all is fine.
Pretty simple, right?
Not so fast.
If the XML Schema declares the units attribute to be either fixed or with a default:
<xsd:attribute name="units" type="xsd:string" default="feet" />
or
<xsd:attribute name="units" type="xsd:string" fixed="feet" />
then there are actually two Attitude elements with a units="feet" attribute and the assertion should fail.
Yikes!
The Schematron rule must be revised: it must check that there is one Altitude element that has a units="feet" attribute or has no units attribute.
Lesson Learned: Schematron rules must not be created in isolation, independent of the grammar schema (DTD, XML Schema, Relax NG).
/Roger
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] |

Cart



