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

Reply via email to