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
<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]>