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