[Schematron] Two significant problems with iso_schematron_skeleton_for_saxon.xsl

G. Ken Holman gkholman at CraneSoftwrights.com
Tue Dec 6 17:30:36 EST 2011


I've just unfortunately spent an inordinate amount of time I don't 
have helping a Schematron user work with UBL documents in an XSLT 2 
environment, discovering two significant problems in the 
iso_schematron_skeleton_for_saxon.xsl file that have been the roots 
of his problem.

These problems do not exist in the XSLT 1 environment and have been 
introduced in the XSLT 2 environment for Schematron (at least for the 
Saxon version).

Users of UBL who use Crane's "Context/Value Association to 
Schematron" conversion environment have no problems using XSLT 1:

   http://www.CraneSoftwrights.com/resources/ubl/#cva2sch

This particular user adapted my code in his environment for XSLT 2 
and the following skeleton problems have come to light:

(1) The auto-detect of the use of attributes in context expressions 
does not accommodate rules that are incorporated in the schema using 
the <sch:include> directive ... it appears to only look at the rules 
found in the base schema:

<xsl:param name="attributes">
   <xsl:choose>
     <xsl:when test="//iso:rule[contains(@context,'@') or 
contains(@context,'attribute')]">true</xsl:when>
     <xsl:otherwise>false</xsl:otherwise>
   </xsl:choose>
</xsl:param>

The away around the above is to assemble all of the fragments into a 
single Schematron schema, and then the "//iso:rule" will visit all of 
the rules in the full schema.  But the above will not work if the 
schema stays in fragments.

(2) Even passing an arbitrary value of "true" for $attributes at 
invocation still does not add the attribute pattern to the context 
XPath because of the following top-level variable:

<xsl:variable name="context-xpath">
   <xsl:if test="$attributes='true' and parent::node() ">@*|</xsl:if>
   <xsl:choose>
     <xsl:when test="$only-child-elements='true'">*</xsl:when>
     <xsl:when test="$visit-text='true'">node()</xsl:when>
     <xsl:otherwise>*|comment()|processing-instruction()</xsl:otherwise>
   </xsl:choose>
</xsl:variable>

My understanding is that in XSLT top-level variables are evaluated 
assuming the context of the document node of the input 
document.  This document node has no parent.  The "and 
parent::node()" expression above will *always* evaluate to false, 
thus never adding "@*|" to the XPath expression.  My read of the 
above is that in this stylesheet it is impossible to trigger the 
inclusion of attributes in the search contexts of the stylesheet 
created by Schematron.  Why would it have been included and how was it tested?

I have suggested the user hack the above to be:

   <xsl:if test="$attributes='true'">@*|</xsl:if>

... and to use "attributes=true" on the command line when invoking 
the stylesheet with a fragmented Schematron schema in order to avoid 
the auto-detect bug of not looking for attributes in rules of 
included Schematron fragments.

The user is now successfully detecting attributes in his input 
data.  No changes were needed for Crane's environment ... the problem 
was entirely in the skeleton.

Please advise if I have misunderstood the situation.

I hope this helps in the maintenance of the skeleton.  Certainly 
users of the OASIS code list environment for documents with 
attributes (as in UBL) will appreciate the skeleton being fixed.

. . . . . . . . . Ken

--
Contact us for world-wide XML consulting and instructor-led training
Free 5-hour video lecture: XSLT/XPath 1.0 & 2.0 http://ude.my/t37DVX
Crane Softwrights Ltd.            http://www.CraneSoftwrights.com/s/
G. Ken Holman                   mailto:gkholman at CraneSoftwrights.com
Google+ profile: https://plus.google.com/116832879756988317389/about
Legal business disclaimers:    http://www.CraneSoftwrights.com/legal



More information about the Schematron mailing list