[Date Prev]
| [Thread Prev]
| [Thread Next]
| [Date Next]
--
[Date Index]
| [Thread Index]
Use care in creating Schematron rules that apply to elements withfixed or default attributes
- From: "Costello, Roger L." <costello@mitre.org>
- To: "xml-dev@lists.xml.org" <xml-dev@lists.xml.org>
- Date: Fri, 21 Sep 2012 11:22:31 +0000
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]