Hi all, As an important side note. I've run into a serious limitation a few times already.
Let me explain shortly what I try to do. I want to e.g. generate an XML representation of CSV data from an XQuery generator. I borrowed the schema from the CSV generator and dropped some attributes which are not useful. <?xml version="1.0" encoding="ISO-8859-1"?> <csv:document xmlns:csv="http://apache.org/cocoon/csv/1.0"> <csv:header> <csv:column>Column A</csv:column> <csv:column>Column B</csv:column> <csv:column>Column C</csv:column> </csv:header> <csv:record> <csv:field>Field A1</csv:field> <csv:field>Field B1</csv:field> <csv:field>Field C1</csv:field> </csv:record> <csv:record> <csv:field>Field A2</csv:field> <csv:field>Field B2</csv:field> <csv:field>Field C2</csv:field> </csv:record> </csv:document> Next I wrote a XSLT that transforms this into a CSV file. <?xml version="1.0" encoding="UTF-8"?> <!-- Author: Robby Pelssers This stylesheet transforms a CSV xml file into CSV --> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:csv="http://apache.org/cocoon/csv/1.0"> <xsl:output method="text"/> <xsl:param name="separator" as="xs:string"/> <xsl:variable name="new_line" select="'
'" /> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="csv:document"> <xsl:apply-templates select="csv:header"/> <xsl:apply-templates select="csv:record"/> </xsl:template> <xsl:template match="csv:header"> <xsl:value-of select="fn:string-join(csv:column, $separator)"/><xsl:value-of select="$new_line" /> </xsl:template> <xsl:template match="csv:record"> <xsl:value-of select="fn:string-join(csv:field, $separator)"/><xsl:value-of select="$new_line" /> </xsl:template> </xsl:stylesheet> To test if it works I wrote a little match pattern: <map:match pattern="test_csv_transformer"> <map:generate src="data/csv_generator_testdata.xml"/> <map:transform src="xslt/csv_transformer.xslt" type="saxon"> <map:parameter name="separator" value="	"/> </map:transform> <map:serialize type="text"/> </map:match> And the output works like a charm: Column A Column B Column C Field A1 Field B1 Field C1 Field A2 Field B2 Field C2 But I wanted to create a reusable transformation service and setup following pattern: <map:match pattern="csv-transformation-service/*"> <map:generate src="service-consumer:"/> <map:transform src="xslt/csv_transformer.xslt" type="saxon"> <map:parameter name="separator" value="{1}"/> </map:transform> <map:serialize type="text"/> </map:match> Unfortunately I can't call this from another cocoon block like e.g. <map:match pattern="test-csv-transformer-service"> <map:generate src="data/csv_generator_testdata.xml"/> <map:transform type="servletService"> <map:parameter name="service" value="servlet:shared:/csv-transformation-service/blabla"/> </map:transform> <map:serialize type="text"/> </map:match> The reason is that only XML is supported evidently. But is this a requirement by design or were such use cases not foreseen?! Robby Stacktrace: 2012-05-15 12:33:55.935::INFO: Started SelectChannelConnector@0.0.0.0:8888 javax.servlet.ServletException: org.apache.cocoon.ProcessingException: Failed to process pipeline at [SAXParseException] - servlet:com.nxp.spider2.shared.service+:/csv-transformation-service/blabla:1:1 at <map:serialize type="text"> - file:///C:/development/workspaces/intellij11/CTPI-PX/spider2/search/target/classes/COB-INF/sitemap.xmap:354:39 at <map:transform type="servletService"> - file:///C:/development/workspaces/intellij11/CTPI-PX/spider2/search/target/classes/COB-INF/sitemap.xmap:351:48 at <map:generate> - file:///C:/development/workspaces/intellij11/CTPI-PX/spider2/search/target/classes/COB-INF/sitemap.xmap:350:64 at <map:match> - file:///C:/development/workspaces/intellij11/CTPI-PX/spider2/search/target/classes/COB-INF/sitemap.xmap:349:57 at org.apache.cocoon.servlet.RequestProcessor.service(RequestProcessor.java:230) at org.apache.cocoon.sitemap.SitemapServlet.service(SitemapServlet.java:84) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at org.apache.cocoon.servletservice.ServletServiceContext$PathDispatcher.forward(ServletServiceContext.java:468) at org.apache.cocoon.servletservice.ServletServiceContext$PathDispatcher.forward(ServletServiceContext.java:443) at org.apache.cocoon.servletservice.spring.ServletFactoryBean$ServiceInterceptor.invoke(ServletFactoryBean.java:264) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy21.service(Unknown Source) at org.apache.cocoon.servletservice.DispatcherServlet.service(DispatcherServlet.java:106) at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) at org.apache.cocoon.tools.rcl.wrapper.servlet.ReloadingServlet.service(ReloadingServlet.java:115) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) at org.apache.cocoon.servlet.multipart.MultipartFilter.doFilter(MultipartFilter.java:131) at org.apache.cocoon.tools.rcl.wrapper.servlet.ReloadingServletFilter.doFilter(ReloadingServletFilter.java:66) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.apache.cocoon.servlet.DebugFilter.doFilter(DebugFilter.java:167) at org.apache.cocoon.tools.rcl.wrapper.servlet.ReloadingServletFilter.doFilter(ReloadingServletFilter.java:66) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.apache.cocoon.tools.rcl.wrapper.servlet.ReloadingSpringFilter.doFilter(ReloadingSpringFilter.java:71) at org.apache.cocoon.tools.rcl.wrapper.servlet.ReloadingServletFilter.doFilter(ReloadingServletFilter.java:66) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:536) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:915) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:539) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:405) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) Caused by: org.apache.cocoon.ProcessingException: Failed to process pipeline at [SAXParseException] - servlet:com.nxp.spider2.shared.service+:/csv-transformation-service/blabla:1:1 at <map:serialize type="text"> - file:///C:/development/workspaces/intellij11/CTPI-PX/spider2/search/target/classes/COB-INF/sitemap.xmap:354:39 at <map:transform type="servletService"> - file:///C:/development/workspaces/intellij11/CTPI-PX/spider2/search/target/classes/COB-INF/sitemap.xmap:351:48 at <map:generate> - file:///C:/development/workspaces/intellij11/CTPI-PX/spider2/search/target/classes/COB-INF/sitemap.xmap:350:64 at <map:match> - file:///C:/development/workspaces/intellij11/CTPI-PX/spider2/search/target/classes/COB-INF/sitemap.xmap:349:57 at org.apache.cocoon.ProcessingException.throwLocated(ProcessingException.java:143) at org.apache.cocoon.components.pipeline.AbstractProcessingPipeline.handleException(AbstractProcessingPipeline.java:923) at org.apache.cocoon.components.pipeline.impl.AbstractCachingProcessingPipeline.processXMLPipeline(AbstractCachingProcessingPipeline.java:379) at org.apache.cocoon.components.pipeline.AbstractProcessingPipeline.process(AbstractProcessingPipeline.java:439) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.cocoon.core.container.spring.avalon.PoolableProxyHandler.invoke(PoolableProxyHandler.java:79) at $Proxy40.process(Unknown Source) at org.apache.cocoon.components.treeprocessor.sitemap.SerializeNode.invoke(SerializeNode.java:147) at org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:55) at org.apache.cocoon.components.treeprocessor.sitemap.MatchNode.invoke(MatchNode.java:87) at org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:78) at org.apache.cocoon.components.treeprocessor.sitemap.PipelineNode.invoke(PipelineNode.java:143) at org.apache.cocoon.components.treeprocessor.AbstractParentProcessingNode.invokeNodes(AbstractParentProcessingNode.java:78) at org.apache.cocoon.components.treeprocessor.sitemap.PipelinesNode.invoke(PipelinesNode.java:81) at org.apache.cocoon.components.treeprocessor.ConcreteTreeProcessor.process(ConcreteTreeProcessor.java:239) at org.apache.cocoon.components.treeprocessor.ConcreteTreeProcessor.process(ConcreteTreeProcessor.java:171) at org.apache.cocoon.components.treeprocessor.TreeProcessor.process(TreeProcessor.java:247) at org.apache.cocoon.servlet.RequestProcessor.process(RequestProcessor.java:351) at org.apache.cocoon.servlet.RequestProcessor.service(RequestProcessor.java:169) ... 38 more Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog. at org.apache.cocoon.core.xml.impl.JaxpSAXParser.fatalError(JaxpSAXParser.java:275) at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source) at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source) at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source) at org.apache.xerces.impl.XMLDocumentScannerImpl$PrologDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.apache.cocoon.core.xml.impl.JaxpSAXParser.parse(JaxpSAXParser.java:196) at org.apache.cocoon.core.xml.impl.JaxpSAXParser.parse(JaxpSAXParser.java:204) at org.apache.cocoon.components.source.util.SourceUtil.parse(SourceUtil.java:297) at org.apache.cocoon.servletservice.postable.components.ServletServiceTransformer.endDocument(ServletServiceTransformer.java:99) at org.apache.cocoon.components.sax.XMLTeePipe.endDocument(XMLTeePipe.java:71) at org.apache.xerces.parsers.AbstractSAXParser.endDocument(Unknown Source) at org.apache.xerces.impl.XMLDocumentScannerImpl.endEntity(Unknown Source) at org.apache.xerces.impl.XMLEntityManager.endEntity(Unknown Source) at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source) at org.apache.xerces.impl.XMLEntityScanner.skipSpaces(Unknown Source) at org.apache.xerces.impl.XMLDocumentScannerImpl$TrailingMiscDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.apache.cocoon.core.xml.impl.JaxpSAXParser.parse(JaxpSAXParser.java:196) at org.apache.cocoon.core.xml.impl.JaxpSAXParser.parse(JaxpSAXParser.java:204) at org.apache.cocoon.components.source.util.SourceUtil.parse(SourceUtil.java:297) at org.apache.cocoon.generation.FileGenerator.generate(FileGenerator.java:136) at org.apache.cocoon.components.pipeline.impl.AbstractCachingProcessingPipeline.processXMLPipeline(AbstractCachingProcessingPipeline.java:360) ... 57 more Caused by: org.xml.sax.SAXParseException: Content is not allowed in prolog. at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source) ... 90 more