Re: [xsl] saxon:evaluate() in schematron

Subject: Re: [xsl] saxon:evaluate() in schematron
From: Matthew Stoeffler <Matthew.Stoeffler@xxxxxxxxxx>
Date: Mon, 21 May 2012 16:05:25 -0400
Because there is value in returning the name of the coordinate that is forcing
the line out of the containing block box, not just that the line is out of the
box as a whole.

m./


On May 21, 2012, at 3:11 PM, Imsieke, Gerrit, le-tex wrote:

> 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),'::',$coo
rdName,'::',$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