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