Using XML Schema info in XSL

Subject: Using XML Schema info in XSL
From: "Martin Bryan" <mtbryan@xxxxxxxxxxxxxx>
Date: Sun, 9 May 1999 10:39:50 +0100
I'm currently looking at the impact of an XML Schema description on the
writing of XSL style sheets. I am particularly intrigued by how we can make
use of the XML Schema maxOccur attribute. This can be used as shown in the
following example:

  <elementType name='Order'>
    <elementTypeRef name='MessageID'/>
    <elementTypeRef name='Date' minOccur='1' maxOccur='3'/>
    <elementTypeRef name='RefersTo' minOccur='0' maxOccur='10'/>
    <elementTypeRef name='Buyer'/>
    <elementTypeRef name='Supplier'/>
    <elementTypeRef name='OtherParty' minOccur='1' maxOccur='97'/>
    <elementTypeRef name='Item' minOccur='1' maxOccur='200000'/>

Now say I want to write a template for the Date element. In this template I
want to run a test to ensure that the Date I have found is one of the up-to
three dates whose parent can be Order. (There can  be other dates nested at
deeper levels. At this stage all I want to do is to confirm that the number
of Date children of Order does not exceed the maxOrder value assigned t the
elementTypeRef whose name is Date in the elementType spec for Order.)

So I have to create a test something like:
<xsl:template match="Date">
<xsl:if test="from-preceding-siblings(Date[position()=-1])<doc(???)"/>

The question is what should ??? be if the schema is stored in a relatively
addressed file called order.xsd, the elementTypes are ordered alphabitically
in the file and the definition of Date I am looking for is the first one
given in the Order sequence. (Note: On some models there will be multiple
Date elements in the main sequence, so I need to check it is the first one
whose value I am picking up in the general state.)

Is ??? something like
Am I right in thinking the predicates stack, and does the last predicate
return the value of the maxOccur element or do I have to put the doc(...)
within an xsl:value-of statement?

For the first part of the text I really want something like
from-preceding-siblings-and-self(Date[position()=-1]). Is there any easy way
to acheive this? When I need to apply the test to a second Date element in
the sequence (in those cases where there is one) the test I have does not
work, as the count will include the first batch of dates instead. How can I
restrict the test to those with no intervening non-Date elements?

Martin Bryan

 XSL-List info and archive:

Current Thread