Greg J. Badros gregb@go2net.com |
|
8 August 2000 |
JavaML A complementary XML-based representation for Java source code |
|
XSLT eXtensible Style Language for Transformations |
|
XSLTC An XSLT to Java byte code compiler |
Key observations | ||
XML represents arbitrary graphs reasonably well (and represents trees exceptionally well) | ||
Program source code gets represented internally as a tree—the Abstract Syntax Tree (AST) | ||
Obvious conclusion: We can use XML to represent programs |
So what? (i.e., Who cares?) | |
Why Java? |
% grep FirstApplet < FirstApplet.java | |
public class FirstApplet extends Applet { | |
g.drawString("FirstApplet", 25, 50); | |
XML let’s us reason unambiguously about
program-level concepts (instead of just about syntactic constructs) |
|
Consider casts: (double) x vs. <cast-expr> <type name="int"/> <var-ref name="x"/> </cast-expr> |
Leverage and build on existing expertise, tools, technologies, and experience of the software engineering, languages, databases, web, and documents. | |
(Instead of having to re-invent lots of wheels.) |
<java-class-file name="FirstApplet.java"> | |
<import module="java.applet.*"/> | |
<import module="java.awt.*"/> | |
<class name="FirstApplet" visibility="public"> | |
<superclass name="Applet"/> | |
<method name="paint" visibility="public"> | |
<type name="void" primitive="true"/> | |
<formal-args> | |
<formal-arg name="g" id="frmarg-13"> | |
<type name="Graphics"/></formal-arg> | |
</formal-args> | |
…… |
JavaML Document Type Definition (DTD) | |
Robust, complete implementation using
Jikes Java compiler (open-sourced compiler originally from IBM) |
|
XSLT stylesheets to view JavaML as classical source code, or as pretty-printed HTML | |
Example queries, transformations, tools |
JavaML home page: http://www.go2net.com/people/gregb/JavaML |
|
WWW9 paper: “JavaML: A Markup Language for Java Source Code”, Amsterdam, May 2000. | |
SeaJUG talk, Wednesday August 16th |
ltxml – sggrep, sgcount, sgrpg | ||
Perl – XML::Parser::PerlSAX, XML::DOM | ||
perlSGML – dtd2html, dtddiff, dtdtree | ||
xmldiff, XML Notepad, XML Spy | ||
Java | ||
XP, Xerces [xml4j] (XML Parsers) | ||
XT, Saxon, LotusXSL, Xalan (XSLT Interpreters) |
XSL: eXtensible Style Language
XSL FO (Formatting Objects) W3C working draft, 27 March 2000 |
|
XSLT (Transformations) W3C recommendation, 16 November 1999 |
Mostly interesting if/when web browsers support XSL FO | |
Until then, interesting for page layout applications |
Expressive, largely declarative language for specifying transformations from XML to other formats | |
Output can be XML (e.g., XHTML, other XML instances), HTML, plain text, etc. | |
Client-side (in-browser) support is still limited, but useful server-side and for batch transformations |
Also an XML application | |
Uses the xsl: namespace | |
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text"/> |
|
<xsl:template
match="/"> <xsl:text>Hello world!</xsl:text> </xsl:template> |
|
</xsl:stylesheet> |
xsl:stylesheet defines namespaces, version | |
Imports, inclusions, output declarations, parameter and variable declarations | |
Multiple template rules |
<html
xsl:version="1.0" xmlns:xsl="http://www…"> <body>Hello world</body> </html> |
<?xml version="1.0"
encoding="UTF-8"?> <person> <name>Greg</name> <email username="gregb" domain="go2net.com"/> <employer>Go2Net</employer> </person> |
Classic substitution
style
templates (a la JSP, GSP)
<html xsl:version="1.0“ xmlns:xsl="http://www…"> <body> <xsl:value-of select="person/name"/>, <xsl:value-of select="person/email/@username"/> @ <xsl:value-of select="person/email/@domain"/> (<xsl:value-of select="person/employer"/>) </body> </html> |
XML Path language, Version 1.0 W3C Recommendation 16 Nov 1999 |
|
Part of XSLT and XPointer | |
Domain-specific plain-text language for describing sets of nodes | |
XPath expressions may also evaluate to booleans, numbers, and strings |
Most common type of XPath expression | |
Like file paths, can be absolute (starts with “/” or relative, and can include multiple “steps” separated by “/” | |
person/name contains 2 steps, person/email/@username contains 3 |
|
Made up of three parts | ||
Axis specifier, followed by :: | ||
Node test (the type of the node) | ||
0 or more predicates enclosed in [ ] | ||
E.g., attribute::* ancestor-or-self::text() child::para[position()=last()] |
Pretty verbose,
so there’s shorthand…
attribute:: is abbreviated @,
e.g., attribute::* becomes @* |
|
child:: axis specifier can be
omitted inside [ ], position() tests are implicit e.g., child::para[position()=last()] becomes para[last()] |
|
Very powerful… | |
Darn complex… | |
Often subtle semantics… | |
Tip: Learn XPath well, and learn it first (before the rest of XSLT) |
A stylesheet is just a lists of template rules for matching against the source tree, and substituting partial results | |
<xsl:template match="…"> | |
…substitution here… | |
</xsl:template> | |
match attribute is a pattern expression (subset of legal XPath expressions) |
Template rules say what the transformations should be | |
Rather than how the transformation will be accomplished | |
Processing model is described in the technical reports |
Input nodes can match multiple template rules | |
Imported rules have lower precedence than local rules | |
Lower priority rules have lower precedence | |
Priority roughly corresponds to specificity of the matching pattern |
<xsl:template
match="*|@*"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> |
Instruction to recursively process all children of the current node | |
select attribute for filtering children to be processed | |
<?xml version="1.0"
encoding="UTF-8"?> <person> <name>Greg</name> <email username="gregb" domain="go2net.com"/> <employer>Go2Net</employer> </person> |
Identity transform + use more specific rule for email elements: | |
<xsl:template match="email"/> |
I use XSLT to convert from JavaML to: | ||
Ordinary Java source code (Plain Old Source Representation, POSR) |
||
HTML pretty-printed view, with index, indentation, colorization | ||
Much easier than doing the conversions using DOM and Perl | ||
HTML Pretty-printed | |
using XSLT | |
(displayed in IE 5) |
No else clause—if you need that, use choose, when, and otherwise | |
Example: | |
<xsl:if
test="@final"> <em><font color="{$clr-final}"> <xsl:text>final </xsl:text> </font></em> </xsl:if> |
<xsl:choose> <xsl:when test="@final"> <em><font color="{$clr-final}"> <xsl:text>final </xsl:text></font></em> </xsl:when> <xsl:otherwise> <xsl:text>not-final</xsl:text> </xsl:otherwise> </xsl:choose> |
<xsl:template
name="semicolon-nl"> <xsl:text>;</xsl:text> <xsl:call-template name="newline"/> </xsl:template> |
|
Use name attribute of template |
Iteration is available: | |
<xsl:for-each select="implement"> <xsl:value-of select="@interface"/> <xsl:if test="not(position()=last())"> <xsl:text>, </xsl:text> </xsl:if> </xsl:for-each> |
See my JavaML distribution: http://www.go2net.com/people/gregb/JavaML page also contains a bunch of useful links |
|
Book recommendations listed in index at: http://www.go2net.com/people/gregb/ | |
Work by Jacek Ambroziak, et al., at Sun | |
Compile the XSL file into a .class file that corresponds to a translet | |
Partial evaluation of an interpreter w.r.t. a stylesheet | |
Eliminates XSL parse time, other optimizations possible | |
Incomplete implementation still, or…. |
A full
implementation
of XSLT-lite?
Some features of XSLT are especially hard to implement efficiently | |
Argument: better to disallow wholly inefficient things than to make performance suffer dramatically (without warning) | |
Best case though: expressiveness + detailed understanding of performance implications |