Re: Schematron transform in a Cocoon pipeline
Oskar, Excellent suggestion. The XPATH of the error would be very useful for debugging. What applications of Schematron have you done within Cocoon? So far, I'm using it to validate uploaded documents. -- jack 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:messageMarkup Error: no test attribute in lt;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:errorIf 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:sourcexsl: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
Re: Schematron transform in a Cocoon pipeline
Jack, I also use it to validate uploaded documents. When cocoon receives the document, first, I check with the parser (inside the generator), that the document is well formed and valid according to a certain W3C Schema. But there are some verifications that the W3C Schema can't check, so, for them, there is a second validation step, in which I use the Schematron which is embedded in the W3C Schema. map:match pattern=validationRequest map:generate src=forms/sendDocument.xml/ map:transform src=stylesheets/wizard2html.xsl/ map:transform src=stylesheets/xmlform2html.xsl/ map:serialize/ /map:match map:match pattern=validationResponse map:generate type=myStream map:parameter name=file-name value=document/ map:parameter name=validation value=true/ /map:generate map:transform src=cocoon:/schematron2compiledSchematron/ map:transform src=stylesheets/schematronError2error.xsl/ map:transform src=stylesheets/error2html.xsl/ /map:match map:match pattern=schematron2compiledSchematron map:generate src=schemas/berta.xsd/ map:transform type=xalan src=stylesheets/getSchematron.xsl/ map:transform type=xalan src=stylesheets/skeleton1-5.xsl/ map:serialize type=xml/ /map:match Now, as Jeff Turner suggested (http://marc.theaimsgroup.com/?l=xml-cocoon-usersm=104306512017996w=2), I'm thinking on moving the W3C Schema validation from the generator to a transformer (ValidationTransformer), because I had an example where the validation must be after procesing the document. Oskar - Original Message - From: [EMAIL PROTECTED] To: [EMAIL PROTECTED] Sent: Wednesday, January 22, 2003 1:24 PM Subject: Re: Schematron transform in a Cocoon pipeline Oskar, Excellent suggestion. The XPATH of the error would be very useful for debugging. What applications of Schematron have you done within Cocoon? So far, I'm using it to validate uploaded documents. -- jack 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:messageMarkup Error: no test attribute in lt;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
Re: Schematron transform in a Cocoon pipeline
On Tuesday, Jan 21, 2003, at 20:58 Europe/London, John R. Callahan wrote: 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. You might find the 'slash-edit' sample in Cocoon 2.1 scratchpad a useful example, it is based on the skeleton 1.5 if I remember correctly. The validating XSLT is generated from an internal pipeline. regards Jeremy - 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]
Re: Schematron transform in a Cocoon pipeline
Jack, I also use it to validate uploaded documents. First, when cocoon receives the document, I applied to it the first validation step with the parser (inside the generator): the parser will check that the document is well formed and valid according to a certain W3C XML Schema. But there are some verifications which can't be done with the schema, so for them I use the Schematron which is embedded in the W3C Schema. map:match pattern=validationRequest map:generate src=forms/sendDocument.xml/ map:transform src=stylesheets/wizard2html.xsl/ map:transform src=stylesheets/xmlform2html.xsl/ map:serialize/ /map:match map:match pattern=validationResponse map:generate type=myStream map:parameter name=file-name value=document/ map:parameter name=validation value=true/ /map:generate map:transform src=cocoon:/schematron2compiledSchematron/ map:transform src=stylesheets/schematronError2error.xsl/ map:transform src=stylesheets/error2html.xsl/ map:serialize/ /map:match map:match pattern=schematron2compiledSchematron map:generate src=schemas/berta.xsd/ map:transform type=xalan src=stylesheets/getSchematron.xsl/ map:transform type=xalan src=stylesheets/skeleton1-5.xsl/ map:serialize type=xml/ /map:match Now, as Jeff Turner suggested in http://marc.theaimsgroup.com/?l=xml- cocoon-usersm=104308827116656w=2 , I'm thinking on moving the W3C schemaValidation from the generator to a transformer (ValidationTransformer), using JARV. Oskar Oskar, Excellent suggestion. The XPATH of the error would be very useful for debugging. What applications of Schematron have you done within Cocoon? So far, I'm using it to validate uploaded documents. -- jack 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:messageMarkup 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
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:errorIf 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:sourcexsl: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]
Re: Schematron transform in a Cocoon pipeline
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:messageMarkup Error: no test attribute in lt;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:errorIf 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:sourcexsl: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]