XML.orgXML.org
FOCUS AREAS |XML-DEV |XML.org DAILY NEWSLINK |REGISTRY |RESOURCES |ABOUT
OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

[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

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]


News | XML in Industry | Calendar | XML Registry
Marketplace | Resources | MyXML.org | Sponsors | Privacy Statement

Copyright 1993-2007 XML.org. This site is hosted by OASIS