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