3. What is DAX
• DAX means Declarative API for XML
• A way to process XML
• By expressing what parts of a document
you want to process
• Based on Java, Javascript and Cocoon
4. DAX History
• Feb 2005: Kim Wolk writes XMLTO, a .NET
library that transforms XML into objects
• March 2005: Ryan Cox ports it to Java 5,
using Annotations and dom4j‘s Transformer
API
• 2006 to 2007: DAX is used in production at
Mindquarry, adopted to Cocoon
13. DAX-Java How to use it
public class ElementCounter extends Transformer {
Map elements = new Hashmap<String, Integer>();
public void processElement(Node context) {
String name = context.getName();
if (elements.hasKey(name)) {
elements.put(name, elements.get(name) + 1);
} else {
elements.put(name, 1);
}
}
}
14. DAX-Java How to use it
public class ElementCounter extends Transformer {
Map elements = new Hashmap<String, Integer>();
@Path(quot;*quot;) //select all elements
public void processElement(Node context) {
String name = context.getName();
if (elements.hasKey(name)) {
elements.put(name, elements.get(name) + 1);
} else {
elements.put(name, 1);
}
}
}
15. DAX-Java How to use it
public class SourceCounter extends Transformer {
Map sources = new Hashmap<String, Integer>();
@Path(quot;img[@src]quot;) //select all elements
public void processElement(Node context) {
String name = this.valueOf(quot;@srcquot;);
if (elements.hasKey(name)) {
elements.put(name, elements.get(name) + 1);
} else {
elements.put(name, 1);
}
}
}
16. DAX-Java How it works
• Simple parsing algorithm:
• traverse the DOM of the XML document
• for each node, find an annotated method
• with matching XPath
• execute this method
• Just like XSLT's templates
19. DAX-Javascript Why?
• XSLT is fine for transforming XML
• but no side-effects possible
• no access to external data model
Input XSLT Output
?
Model
20. DAX-Javascript Background
• Map most important XSLT concepts to
Javascript concepts
XSLT Javascript
<xsl:stylesheet> Stylesheet object
template function of the Stylesheet
<xsl:template>
object
applyTemplate function of the
<xsl:apply-templates/>
Stylesheet object
copy function of the Stylesheet object
<xsl:copy/>
(with inlined body function)
21. DAX-Javascript How to use it
<xsl:template match=quot;fooquot;>
<bar>
<xsl:comment>example code uses foo</xsl:comment>
<xsl:apply-templates />
</bar>
</xsl:template/>
Stylesheet.template({match:quot;fooquot;}, function(node) {
this.element(quot;barquot;, function(node) {
this.comment(quot;example code uses fooquot;);
this.applyTemplates();
});
});
22. DAX-Javascript How to use it
<xsl:template match=quot;node()|@*quot;>
<xsl:copy>
<xsl:apply-templates select=quot;node()|@*quot; />
</xsl:copy>
</xsl:template/>
Stylesheet.template({match:quot;node()|@*quot;}, function
(node) {
this.copy(function(node) {
this.applyTemplates({select:quot;node()|@*quot;})
});
});
23. DAX-Javascript How it works
• Uses Rhino Javascript Engine
• full access to Java object model
• allows side-effects when transforming
XML
• Parses the incoming XML stream
• Finds and fires matching functions
25. DAX-Cocoon How to use it
<map:components>
<map:transformers>
<map:transformer name=quot;daxquot;
src=quot;dax.cocoon.DAXTransformerquot; />
</map:transformers>
</map:components>
26. DAX-Cocoon How to use it
<map:match pattern=quot;/resource/*quot;>
<map:select type=quot;request-methodquot;>
<map:generate type=quot;streamquot; />
<map:when test=quot;PUTquot;>
<map:transform type=quot;daxquot; src=quot;dax/res.jsquot;>
<map:parameter name=quot;resquot; value=quot;{1}quot; />
</map:transform>
</map:when>
</map:select>
</map:match>
27. DAX-Cocoon How to use it
var resourcemanager =
cocoon.getComponent(quot;resourcemanagerquot;);
Stylesheet.template({match:quot;delquot;}, function(node) {
var that = this;
this.copy(function(node) {
if (that.valueOf(quot;.quot;)==cocoon.parameters.res) {
resourcemanager.delete(that.valueOf(quot;@nodequot;))
}
this.applyTemplates({select:quot;node()|@*quot;})
});
});
28. DAX-Cocoon How it works
• Implemented as a Cocoon Transformer
• Pull in quot;cocoonquot; object as Flowscript does
• Usage Scenario: REST Application
• validate using DAX (e.g. by checking
database)
• transform using DAX (e.g by triggering
actions)
• save using DAX (e.g. by changing model)
29. DAX-Cocoon Open Questions
• Caching
• We do not know if a transformation has
non-cacheable side-effects
• Mixing DAX and XSLT
• perhaps E4X is a way to conveniently
embed XSLT
• Not all XSLT concepts implemented (sorting)
30. How to go on?
• Read more
• http://www.asciiarmor.com/2005/03/03/introducing-
dax-declarative-api-for-xml/
• https://www.mindquarry.org/wiki/dax/
• http://www.codeconsult.ch/bertrand/archives/
000802.html
• Download
• http://releases.mindquarry.org/dax/
• (Maven artifacts available)
31. Thank you very much
lars@trieloff.net
For more information, see my weblog at
http://weblogs.goshaky.com/weblog/lars