← Prev in month ← Prev in thread
Next in thread → Next in month →

Use care in creating Schematron rules that apply to elements with fixed or default attributes

From
Costello, Roger L. <>
To
"" <>
Date
2012-09-21T11:22:31Z
ID
<>
Thread
Use care in creating Schematron rules that apply to elements with fixed or default attributes
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
← Prev in month ← Prev in thread
Next in thread → Next in month →