[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: saxon:evaluate() in schematron

Subject: Re: saxon:evaluate() in schematron
From: "Imsieke, Gerrit, le-tex" <gerrit.imsieke@xxxxxxxxx>
Date: Mon, 21 May 2012 21:11:30 +0200
Re:  saxon:evaluate() in schematron
Why use evaluate when you can specify the assertion in a reasonably simple XPath expression?

<s:rule context="line">
<s:assert test="every $coord in (@x1, @x2) satisfies
(
xs:integer($coord) le
xs:integer(../../block[@n eq current()/@n]/@x2)
and
xs:integer($coord) ge
xs:integer(../../block[@n eq current()/@n]/@x1)
)
and
(
every $coord in (@y1, @y2) satisfies
(
xs:integer($coord) le
xs:integer(../../block[@n eq current()/@n]/@y2)
and
xs:integer($coord) ge
xs:integer(../../block[@n eq current()/@n]/@y1)
)
)"
id="non-fitting-line">Line <s:value-of select="@n"/> does not fit.</s:assert>
</s:rule>


Gerrit


On 2012-05-21 19:48, Matthew Stoeffler wrote:
Hello.

I'm working on a schematron script (iso schematron) in which I'm trying to confirm a relationship between two elements representing containing boxes. So, source xml looks like 

<ref id="r7">
     <label>5</label>
     <block n="10" page="p-65" x1="579" y1="4604" x2="2634" y2="4682"/>
     <citation id="c19" citation-type="other">
         <line n="10" page="p-65" x1="1690" y1="4604" x2="2612" y2="4682"><![CDATA[Walther Straram, Paris, 193I]]></line>
     </citation>
</ref>

. and the relationship I'm looking for is whether the line (or lines) are within the block, and, most frustratingly, which coordinates are at fault if it doesn't fit.

My schematron pattern uses one function to ascertain whether or not the line fits, and, if not, attempts to run the 'reportBadCoords' function to identify which coordinates fail. The function looks like this 

  <xsl:function name="ins:reportBadCoords" as="xs:string">
         <xsl:param name="coordNode" as="node()"/>
         <xsl:param name="coordName" as="xs:string"/>
         <xsl:param name="blockPath" as="xs:string"/>
         <xsl:param  name="context" as="node()"/>
         <xsl:variable as="xs:string" name="blkCoordPath" select="concat('/',$blockPath,'/@',$coordName)"/>
        <xsl:choose>
            <xsl:when test="$coordName = 'x1'
                and number(saxon:evaluate(concat('$p1',$blkCoordPath),$context))&lt; number($coordNode)"><xsl:value-of select="$coordName"/></xsl:when>
            <xsl:when test="$coordName = 'x2'
                and number(saxon:evaluate(concat('$p1',$blkCoordPath),$context))&gt; number($coordNode)"><xsl:value-of select="$coordName"/></xsl:when>
            <xsl:when test="$coordName = 'y1'
                and number(saxon:evaluate(concat('$p1',$blkCoordPath),$context))&lt; number($coordNode)"><xsl:value-of select="$coordName"/></xsl:when>
            <xsl:when test="$coordName = 'y2'
                and number(saxon:evaluate(concat('$p1',$blkCoordPath),$context))&gt; number($coordNode)"><xsl:value-of select="$coordName"/></xsl:when>
           <!-- debugging -->
            <xsl:otherwise><xsl:value-of select="concat(saxon:evaluate(concat('$p1',$blkCoordPath),$context),'::',$coordName,'::',$blkCoordPath,'::',$coordNode)"/>
         </xsl:otherwise>
         </xsl:choose>
     </xsl:function>

and is invoked from this rule.

  <rule context="line">
             <let name="lineNo" value="@n"/>
             <let name="refId" value="ancestor::ref/@id"/>
             <let name="artId" value="ancestor::article/front/article-meta/article-id[@pub-id-type='doi']"/>
             <assert test="some $bl in ancestor::ref/block satisfies(ins:isContainedInBlock($bl, .))">
                 The current citation line (number:<value-of select="$lineNo"/>  ) does not fit within any of the defined blocks in the containing ref (ref id =<value-of select="$refId"/>).
                  [article id =<value-of select="$artId"/>].
                 Bad coords:
                 <value-of select="for $coord in @*[matches(name(),'[xy][12]')] return ins:reportBadCoords($coord,name($coord),functx:path-to-node-with-pos(ancestor::ref/block),current())"/>
             </assert>
         </rule>


When I test this script in Oxygen 13.2, with Saxon PE 9.305, I either fail to return any value from the evaluate() function, or if I remove the reference to context and just pass $blkCoordPath straight to evaluate(), I get message that I'm selecting root node without proper context, or context undefined.


Thanks for any help.

Matt S.


-- Gerrit Imsieke Geschdftsf|hrer / Managing Director le-tex publishing services GmbH Weissenfelser Str. 84, 04229 Leipzig, Germany Phone +49 341 355356 110, Fax +49 341 355356 510 gerrit.imsieke@xxxxxxxxx, http://www.le-tex.de

Registergericht / Commercial Register: Amtsgericht Leipzig
Registernummer / Registration Number: HRB 24930

Geschdftsf|hrer: Gerrit Imsieke, Svea Jelonek,
Thomas Schmidt, Dr. Reinhard Vvckler

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.