Hi Jack,

I have done the same to validate an XML document with an schematron. I think
that it would be also useful to get the XPATH path of the errors in the XML
output. The template which does this is done in skeleton1-5 (<axsl:template
match="*|@*" mode="schematron-get-full-path">); so you have to call it from
the assert template:

<xsl:template match="sch:assert | assert">
    <xsl:if test="not(@test)">
        <xsl:message>Markup Error: no test attribute in
&lt;assert></xsl:message>
    </xsl:if>
    <axsl:choose>
        <axsl:when test="{@test}"/>
        <axsl:otherwise>
            <error> <!--my xml output-->
                <message> <!--my xml output-->
                    <xsl:call-template name="process-assert">
                    <xsl:with-param name="role" select="@role"/>
                    <xsl:with-param name="id" select="@id"/>
                    <xsl:with-param name="test"
select="normalize-space(@test)" />
                    <xsl:with-param name="icon" select="@icon"/>
                    <xsl:with-param name="subject" select="@subject"/>
                    <xsl:with-param name="diagnostics"
select="@diagnostics"/>
                    </xsl:call-template>
                </message>
                <location> <!--my xml output-->
                    <axsl:apply-templates mode="schematron-get-full-path"
select="self::*"/> <!--XPATH path of the error-->
                </location>
            </error>
         </axsl:otherwise>
    </axsl:choose>
</xsl:template>

Oskar

----- Original Message -----
From: "John R. Callahan" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, January 21, 2003 9:58 PM
Subject: Schematron transform in a Cocoon pipeline


> This seems too simple, but I wanted to see if I could
> use Schematron generated XSLT to validate some
> XML in a Cocoon pipeline.  This might be used for
> validating uploaded  XML files for example.
>
> I downloaded the latest Schematron skeleton (1.5),
> then generated some XSLT from a set of assertions,
> and then put it into a transform in a pipeline with some
> data:
>
> <map:match pattern="*.xml">
>   <map:generate src="{1}.xml"/>
>   <map:transform src="asserts1.xsl"/>
>   <map:serialize type="xml"/>
> </map:match>
>
> <!-- build the Schematron generated XSLT -->
> <map:match pattern="asserts1.xsl">
>   <map:generate src="asserts1.sch"/>
>   <map:transform src="skeleton1-5.xsl"/>
>   <map:transform src="store.xsl">
>       <map:parameter name="file" value="asserts1.xsl"/>
>       <map:parameter name="dir" value="."/>
>   </map:transform>
>   <map:transform type="write-source"/>
>   <map:serialize type="xml"/>
> </map:match>
>
> (see below for the source code for store.xsl)
>
> Unfortunately, the Schematron skeleton puts out plain
> text messages so the output from data1.xml isn't well-formed
> XML.  What I wanted was a series of applicable
> Schematron messages as XML output.  So, I altered
> the skeleton somewhat and now I works!
>
> My alterations to the skeleton were pretty simple:
>
> (1)  Add the following template:
>
> <xsl:template match="sch:error | error" mode="text">
>      <xsl:copy-of select="."/>
> </xsl:template>
>
> (2) Wrap a <sch:results> around the "/" template:
>
>   <axsl:template match="/">
>       <sch:results>
>           <xsl:call-template name="process-root">
>             ...
>           </xsl:call-template>
>       </sch:results>
>   </axsl:template>
>
> Finally, you must wrap all messages in the .sch file with
> <sch:error>...</sch:error> as follows:
>
> <sch:schema xmlns:sch="http://www.ascc.net/xml/schematron";>
> ...
> <sch:assert test="(@Title = 'Mr' and Sex = 'Male') or @Title != 'Mr'">
>   <sch:error>If the Title is "Mr" then the sex of the person must be
"Male".</sch:error>
> </sch:assert>
> ...
> </sch:schema>
>
> Enjoy!
>
> -- jack
>
>
> (The XSLT file "store.xsl" is my own brew to wrap an
> element around the input source for use by the subsequent
> SourceWriterTransformer:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <!-- CVS: $Id: store.xsl,v 1.1 2002/12/16 11:04:11 callahan Exp $ -->
>
> <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>
> <xsl:param name="file" select="'foo'"/>
> <xsl:param name="dir" select="'foo'"/>
>
> <xsl:template match="/">
>     <source:write xmlns:source="http://apache.org/cocoon/source/1.0";>
>  <source:source><xsl:value-of select="$dir"/>/<xsl:value-of
select="$file"/></source:source>
>  <source:fragment>
>      <xsl:copy-of select="."/>
>  </source:fragment>
>     </source:write>
> </xsl:template>
>
> </xsl:stylesheet>
> )
>
>
>
> ---------------------------------------------------------------------
> Please check that your question  has not already been answered in the
> FAQ before posting.     <http://xml.apache.org/cocoon/faq/index.html>
>
> To unsubscribe, e-mail:     <[EMAIL PROTECTED]>
> For additional commands, e-mail:   <[EMAIL PROTECTED]>
>


---------------------------------------------------------------------
Please check that your question  has not already been answered in the
FAQ before posting.     <http://xml.apache.org/cocoon/faq/index.html>

To unsubscribe, e-mail:     <[EMAIL PROTECTED]>
For additional commands, e-mail:   <[EMAIL PROTECTED]>

Reply via email to