Copyright (c) 1998, 1999 James Clark
See the file copying.txt for copying permission.
XT is an implementation in Java of XSL Transformations. This version of XT implements the WD-xslt-19990709 version of XSLT. Stylesheets written for earlier versions of the XSLT WD must be converted before they can be used with this version of XT.
This should be considered a beta release.
To use XT, you need:
Locator
information,
otherwise you won't get any line numbers in error messagesPut xt.jar
in your CLASSPATH
, together
with whatever is needed for your XML parser, and sax.jar
if that isn't included with your XML parser. Then use the
command:
java -Dcom.jclark.xsl.sax.parser=your-sax-driver com.jclark.xsl.sax.Driver source stylesheet result
To find a SAX parser, XT first uses the value of the system
property com.jclark.xsl.sax.parser
; if this is not set it
uses the value of the system property org.xml.sax.parser
;
if this is not set it uses the class
com.jclark.xml.sax.CommentDriver
(This subclasses the
normal XP SAX driver to provide support for comments; it is present
only in XP version 0.5 or later; if you have an earlier version of XP
use -Dcom.jclark.xsl.sax.parser=com.jclark.xml.sax.Driver
instead.)
Alternatively under Windows you can use XT packaged as a Win32 executable. This includes XP and SAX. To use this, you will need to have the Microsoft Java VM installed (this is included with IE). Run this with the command:
xt source stylesheet result
The public interface to XT is
com.jclark.xsl.sax.XSLProcessor
which is implemented by
com.jclark.xsl.sax.XSLProcessorImpl
.
The following features of the XSLT WD are not yet implemented:
substring
functionstring-length
functionpreceding
axisnamespace
axisxsl:locale
element and the optional third
argument on the format-number()
functiondocument()
function)xsl:key
element, and the key()
function)xsl:message
elementunparsed-entity-uri
functionresult-encoding
attribute on
xsl:stylesheet
result-version
attribute on
xsl:stylesheet
Error reporting is rather haphazard. XT does not attempt to validate stylesheets. When it detects an error, it either silently recovers from it, or gives a fatal error. Forwards-compatible processing is not yet implemented.
Not much effort has yet been devoted to optimizing performance.
The implementation of some features is known to be slow (notably
xsl:number
).
A call to a function ns:foo
where ns
is bound to a namespace of the form
http://www.jclark.com/xt/java/className
is
treated as a call of the static method foo
of
the class with fully-qualified name
className
. (XT does not currently make use of
the xsl:functions
element.) Hyphens in method names are
removed with the character following the hyphen being upper-cased.
Overloading based on number of parameters is supported; overloading
based on parameter types is not. A non-static method is treated like
a static method with the this
object as an additional
first argument. A constructor is treated like a static method named
new
. Extension functions can return objects of arbitrary
types which can then be passed as arguments to other extension
functions or stored in variables.
For example, the following
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0" xmlns:date="http://www.jclark.com/xt/java/java.util.Date" xmlns="http://www.w3.org/TR/REC-html40" result-ns=""> <xsl:template match="/"> <html> <xsl:if test="function-available('date:to-string') and function-available('date:new')"> <p><xsl:value-of select="date:to-string(date:new())"/></p> </xsl:if> </html> </xsl:template> </xsl:stylesheet>
will print out the current date.
Types are mapped between XSLT and Java as follows:
XSLT type | Java type |
---|---|
string | java.lang.String |
number | double |
boolean | boolean |
node-set | com.jclark.xsl.om.NodeIterator |
result tree fragment | com.jclark.xsl.sax.ResultTreeFragment |
On return from an extension function, an object of type
com.jclark.xsl.om.Node
is also allowed and will be
treated node-set; also any numeric type is allowed an will be
converted to a number.
The demo
directory has a couple of examples.
The result-ns
attribute can be used to get non-XML
output. A result namespace of
http://www.w3.org/TR/REC-html40
will make XT produce
output that conforms to the HTML 4.0 Recommendation. To use this the
xsl:stylesheet
element should look like this:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0" xmlns="http://www.w3.org/TR/REC-html40" result-ns=""> </xsl:stylesheet>
The result namespace can also use a java:
URI. This
should identify a class that implements the
org.xml.sax.DocumentHandler
and
com.jclark.xsl.sax.OutputStreamConverter
interfaces.
The com.jclark.xsl.sax.NXMLOutputHandler
is one such
class, which is included in XT. This supports a result namespace
which is described by the following DTD:
<!ELEMENT nxml (escape*, (control|data)*)> <!ATTLIST nxml encoding NMTOKEN #IMPLIED> <!ELEMENT escape (#PCDATA|char)*> <!ATTLIST escape char CDATA #REQUIRED> <!ELEMENT control (#PCDATA|char|data|control)*> <!ELEMENT data (#PCDATA|data|control)*> <!ELEMENT char EMPTY> <!ATTLIST char number NMTOKEN #REQUIRED>
The nxml
element is the root element; the
encoding
attribute is the name of an encoding supported by your Java VM that will be used
to encode characters as bytes.
The data
element contains data. Within a
data
element control characters get escaped. The
escape
element specifies how a particular control
character gets escaped.
The control
element contains control information.
Within a control
element, all characters are output
directly without escaping.
The char
element allows the output of a character that
is not allowed by XML (such as control-L).
For example, the following stylesheet
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0" xmlns="java:com.jclark.xsl.sax.NXMLOutputHandler" result-ns=""> <xsl:template match="/"> <nxml> <escape char="\">\\</escape> <data>&<>\</data> <control>&<>\</control> </nxml> </xsl:template> </xsl:stylesheet>
will output
&<>\\&<>\
Please report bugs to me. When reporting bugs please be sure to include both a complete stylesheet and complete source document that illustrate the bug.
James Clark