| <?xml version="1.0"?> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <document> |
| |
| <properties> |
| <title>XML Pipelines</title> |
| <author email="jstrachan@apache.org">James Strachan</author> |
| </properties> |
| |
| <body> |
| |
| <section name="XML Pipelines"> |
| |
| <p> |
| Rather like the Cocoon project, Jelly also supports the concept of <i>XML pipelines</i>. |
| The idea in an XML pipeline is for XML events to be created by some generator and then |
| flow through multiple filters, transformers or processors to some ultimate output. |
| Currently XML events are implemented via <a href="http://sax.sf.net/">SAX</a>. |
| </p> |
| |
| |
| <subsection name="A Jelly script is a compiled SAX stream"> |
| <p> |
| Jelly compiles XML into a <a href="apidocs/org/apache/commons/jelly/Script.html">Script</a>. |
| This mechanism works just the same whether the document is totally static, partially dynamic, |
| with just a few dynamic expressions inside it, or its totally dynamic using XML pipelines or invoking SOAP services etc. |
| </p> |
| <p> |
| Jelly effectively turns XML into an executable Script that when its run will output XML events. |
| So this is effectively a dynamic XML event cache. The Script can contain dynamic fragments. |
| This means that at runtime, there is no need to parse the script as the compiled Script can be cached which avoids unnecessary |
| XML parsers while still keeping content dynamic. |
| </p> |
| |
| </subsection> |
| |
| <subsection name="Using Tags as source, filter, transformation or destination in a pipeline"> |
| |
| <p> |
| Each Jelly <a href="apidocs/org/apache/commons/jelly/Tag.html">Tag</a> |
| is given an <a href="apidocs/org/apache/commons/jelly/XMLOutput.html">XMLOutput</a> |
| instance when it is invoked via the doTag() method. |
| The XMLOutput instance is a simple lightweigtht wrapper around SAX |
| ContentHandler and LexicalHandler instances allowing a Tag to take part in any |
| kind of SAX based processing of XML events. |
| </p> |
| |
| <p> |
| A Jelly Tag can choose how to invoke its body. So it could |
| </p> |
| |
| <ul> |
| <li> |
| optionally evaluate its body based on some condition |
| </li> |
| <li> |
| loop over its body via some iteration |
| </li> |
| <li> |
| parse its body into some DOM model or turn the XML events into some kind of Java objects |
| or other kind of data structure |
| </li> |
| <li> |
| perform some arbitrary XML event transformation, like XSLT or apply some SAX Filter etc. |
| </li> |
| <li> |
| output the XML events to some destination |
| </li> |
| </ul> |
| |
| <p> |
| This means that by nesting Jelly tags together its possible to create simple or complex XML pipelines |
| which can be easily integrated with expression languages (like Jexl and XPath) |
| or scripting languages (like JavaScript, Jython etc) as well as using other technologies such as |
| </p> |
| |
| <ul> |
| <li> |
| parsing XML, transforming it with XSLT or using XPath via the <a href="libs/xml/tags.html">xml</a> library |
| </li> |
| <li> |
| parsing HTML via the <a href="libs/html/tags.html">html</a> library |
| </li> |
| <li> |
| performing XML validation against DTD, XML Schema or RelaxNG using the <a href="libs/validate/tags.html">validate</a> library |
| </li> |
| <li> |
| performing SOAP operations via Apache Axis with the <a href="libs/soap/tags.html">soap</a> library |
| </li> |
| <li> |
| mixing and matching the processing of XML in pipelines with support for other libraries like |
| Ant, SQL, HTTP, JMS etc. |
| </li> |
| </ul> |
| |
| <p> |
| It should be noted that highly complex, yet easy to use XML pipelines can be created since the |
| pipelines don't have to be linear. At any point in the chain, custom logic can decide what to do next. |
| </p> |
| |
| <source><![CDATA[ |
| <j:if test="${myBean.fooEnabled('uk')}> |
| <j:file name="${userdir}/results.html"> |
| <x:transform xslt="asHTML.xsl"> |
| <soap:invoke endpoint="http://com.myserver/..."> |
| <x:transform xslt="foo.xsl"> |
| <x:parse xml="${myBean.getSomeURL()}"/> |
| <x:transform> |
| </soap:invoke> |
| </x:transform> |
| </j:file> |
| </j:if> |
| ]]> |
| </source> |
| |
| </subsection>. |
| |
| |
| </section> |
| |
| </body> |
| |
| </document> |