xsl-list
[Top] [All Lists]

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

2012-05-21 15:49:44
It gets increasingly verbose, but how about reporting this:

<s:assert test="…">
Line <s:value-of select="@n"/> does not fit. Offending coordinate(s):
<s:value-of select="
  for $att in
  (@x1, @x2)[
             xs:integer(.) gt
               xs:integer(../../../block[@n eq current()/@n]/@x2)
             or
             xs:integer(.) lt
               xs:integer(../../../block[@n eq current()/@n]/@x1)
            ]
  union
  (@y1, @y2)[
             xs:integer(.) gt
               xs:integer(../../../block[@n eq current()/@n]/@y2)
             or
             xs:integer(.) lt
               xs:integer(../../../block[@n eq current()/@n]/@y1)
            ]
  return concat(name($att), '=', $att)
"/>
</s:assert>


On 2012-05-21 22:05, Matthew Stoeffler wrote:
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),'::',$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.

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


--
Gerrit Imsieke
Geschäftsfü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(_dot_)imsieke(_at_)le-tex(_dot_)de, http://www.le-tex.de

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

Geschäftsführer: Gerrit Imsieke, Svea Jelonek,
Thomas Schmidt, Dr. Reinhard Vöckler

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


--
Gerrit Imsieke
Geschäftsfü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(_dot_)imsieke(_at_)le-tex(_dot_)de, http://www.le-tex.de

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

Geschäftsführer: Gerrit Imsieke, Svea Jelonek,
Thomas Schmidt, Dr. Reinhard Vöckler

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--