XSL is a language for expressing stylesheets. It consists of two parts:
- XSLT is a language for transforming XML documents into other XML documents, and
- an XML vocabulary for specifying formatting semantics (called
Formatting Objects).
The Lotus XSL Processor implements only the first part of XSL,
the April 21 XSL Transformations (XSLT) Draft Specification.
An XSLT stylesheet specifies the transformation of a class of
XML documents by describing how an instance of the class is transformed
into another XML tree of nodes.
LotusXSL uses
Version 1.1.16 or 2.0.9 of IBM's XML for Java (called "XML4J") to parse an
input XML document, or it can be adapted to other DOM-producing mechanisms.
LotusXSL produces SAX events, an output DOM,
or XML result document based on the transformations
specified in the XSL stylesheet.
The processor can be used from the command line, from a servlet, or from a wrapper applet.
New code provides base servlet support to apply XSL stylesheets
(retrieved from various sources) to XML (also retrieved from various
sources). See the DefaultApplyXSL documentation. (Many thanks to
the WebSphere folks for this.)
Stylesheets that worked with the previous version of LotusXSL
will have to be upgraded to match the new draft. Watch for stylesheets that declared
<xsl:stylesheet> with the xmlns:xsl="http://www.w3.org/TR/WD-xsl" namespace
declaration. The namespace should now be xmlns:xsl="http://www.w3.org/XSL/Transform/1.0".
LotusXSL contains a DTD for XSL when used for HTML. (Thanks be to
Henrique M. Holschuh for this). This DTD should not be used for run-time
production when performance is a concern,
but is useful during the development stages. It is used in the readme XSL.
A local copy of the IBM LotusXSL Comercial License Agreement
is included.
This version has had low-hanging-fruit performance enhancements over version
0.17.0. Future versions will take more radical steps to obtain the kind of performance
needed for production environments.
Processing with validation turned on does not work
when using the 2.0.9 version of XML4J. This
is an issue with XML4J, and is being addressed by that team.
Thanks goes to Thomas Rowe, Sanjiva Weerawarana, Don Day, David Marston, David A Epstein,
Noah Mendelsohn, Dean Burson, Joseph Kesselman, Pat O'Connor, Mike Pogue,
Chip Faulkner, Paul Dick, Adam Peller, David Bertoni,
the XSL WG, and others, for the support,
help, and feedback they have given! Also, many thanks for all the folks
who have downloaded LotusXSL so far, and given me feedback, whether good
or bad, and bug reports! Special thanks to Dan, Henrique, and Craig!
- Install Sun's JDK-1.2 or Sun's JRE-1.2
(it will work fine with 1.1.6 or 1.1.7 versions of the Java runtime also).
- Install Version 1.1.16 or 2.0.9 of IBM's XML for Java
- Unzip Lotus XSL Processor to your hard drive (Assuming
you haven't already.)
- Either have XML4J on the system class path, or copy the XML4J jar into
the LotusXSL directory. I recommend having it on the system class path. To
install XML4J and LotusXSL onto the system class path, do something like:
set CLASSPATH=\xml4j_2_0_6\xml4j.jar;lotusxsl.jar;js.jar;%CLASSPATH%
in your autoexec.bat.
To test, you can go into the 'testSuite\xml4j2dom' directory and
type 'test accp\accp01'. You should see it process the files with no complaints.
If it complains, you may have to
adjust the command name or classpath setup in the testsuite\xml4j2dom\test.bat file.
In the LotusXSL root directory there is a 'run' batch file, which
you pass command line parameters. These instructions use version 2.0.9 of XML4J with the
DOM classes.
To use XML4J 1.1.16 you'll need to change the batch files to call
com.lotus.xsl.xml4j.ProcessXSL or, to use the 2.0.9 version with the TX
classes, call com.lotus.xsl.xml4j2tx.XML4JLiaison.
The command line utility is com.lotus.xsl.xml4j.ProcessXSL.
It can take the following command line switches:
-IN inputXMLURL
-XSL XSLTransformationURL
-OUT outputFileName
-PARSER fully qualified class name of parser liaison
-E (Do not expand entity refs)
-V (Version info)
-QC (Quiet Pattern Conflicts Warnings)
-Q (Quiet Mode)
-LF (Use linefeeds only on output {default is CR/LF})
-CR (Use carriage returns only on output {default is CR/LF})
-ESCAPE (Which characters to escape {default is <>&"'\r\n}
-INDENT (Control how many spaces to indent {default is 0})
-TT (Trace the templates as they are being called)
-TS (Trace each select.)
-TTC (Trace the template children as they are being processed)
-VALIDATE (Set whether validation occurs. Validation is off by default)
-EDUMP (Do stackdump on error)
-XML (Use XML formatter and add XML header)
-TEXT (Use simple Text formatter)
-HTML (Use HTML formatter)
-STRIPCDATA (Simply strip CDATA sections. Must have -XML or -HTML)
-ESCAPECDATA (Escape characters in CDATA. Must have -XML)
-PARAM name expression (Set a stylesheet parameter)
There are now UNIX Bourne shell script files:
-
run.sh
- run processor (with 2.0.9 version of XML4J)
in the form of:
run -in foo.xml -xsl foo.xsl -out foo.out
-
testSuite/xml4j1tx/test.sh
- Test LotusXSL with XML4J 1.1.16.
-
testSuite/xml4j2dom/test.sh
- Test LotusXSL with XML4J 2.0.9 Generic DOM.
-
testSuite/xml4j2tx/test.sh
- Test LotusXSL with XML4J 2.0.9 TX compatibility classes.
You may have to edit these in order
to have the correct path to the XML4J jars. There are, of course, corresponding
.bat files.
See the Demonstration Page for some fairly simple
examples of producing XML-styled HTML.
[NOTE:
This requires Java 1.1 and so will not work on earlier versions
of browsers that only support Java 1.0.]
Most of the XML and XSL files that
are used, are in the 'samples' directory. However,
probably the best sample is the XSL and XML that produced this file.
It is located in the 'readme_production' directory.
I hope to be getting some more work done on better samples over
time. If you come up with something cool that you wouldn't mind
sharing, please let me know!
Our test suite, while not comprehensive,
it is an attempt to work towards some methodical testing of features. It's
also a good place for XSL users to go when they need to figure out how to
do something. The test suite files are in the 'testSuite' directory.
We've been reorganizing the testsuite. Currently, the suite is incomplete.
We're working towards migration of the previous test cases to the new scheme.
We've been working towards testing interoperability between this and other XSL
processors. If you find an inconsistency, please let us know.
The testsuite directory has 3 parser-aware subdirectories for testing
with the various XML4J parser options:
-
'testSuite\xml4j1tx' directory
- Test LotusXSL with XML4J 1.1.16.
-
'testSuite\xml4j2dom' directory
- Test LotusXSL with XML4J 2.0.9 Generic DOM.
-
'testSuite\xml4j2tx' directory
- Test LotusXSL with XML4J 2.0.9 TX compatibility classes.
In each of these directories, testall.bat will run through the entire
testsuite. Output files will be created in the current directory.
Please: if you have stylesheet fragments that you think are good
tests, please donate them to the cause...
I now
support HTML special knowledge when the result namespace is HTML, when writing to
a PrintWriter.
When you pass a PrintWriter
to one of the process
functions, LotusXSL calls the
toMarkup
function in the supplied Formatter interface, passing in the
URI for the result namespace. If it is the URI for the HTML namespace
("http://www.w3.org/TR/REC-html40"), it then prints the result tree
using HTML rules. For instance:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"
xmlns="http://www.w3.org/TR/REC-html40" result-ns="">
<xsl:template match="/">
<HTML>
<script><![CDATA[
document.write("<P>Hi Oren");
]]></script>
<BODY>
Some text.<BR/>
Some more text.
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
will produce:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><SCRIPT>
document.write("<P>Hi Oren");
</SCRIPT><BODY>
Some text.<BR>
Some more text.
</BODY></HTML>
Notice the removal of the CDATA
brackets, the removal of the '/' from the BR tag, and the addition of the
HTML doc type.
You can also take a look at the source to this file to see how well it does.
This will only work when using one of the process
interfaces that
stream to a PrintWriter.
You can use the xsl:functions element to declare Java or JavaScript
functions that can then be called from the XSLT expressions. In order to
use JavaScript, you must have js.jar on your class path.
The ns
attribute on xsl:functions tells the processor
which namespace to associate with the extension. The value of the ns
attribute must be a prefix that is declared via the xmlns mechanism.
An example of calling a Java function:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"
xmlns:lxslt="http://xsl.lotus.com/">
<xsl:functions ns="lxslt" type="application/java" classid="testSuite.EXT.CurrentDate"/>
<xsl:template match="/">
<HTML>
<H1>Simple test for Java extension.</H1>
<HR/>
<P>Should print the current date:</P>
<P><xsl:value-of select="lxslt:currentDate()"/></P>
</HTML>
</xsl:template>
</xsl:stylesheet>
See the Tips section for an example of calling
JavaScript.
Parameters are passed to the extensions as strings, NodeLists, or
DocumentFragments (result tree fragments). Automatic type conversion from nodes to
strings and numbers is not very good, so you may need to cast the parameter
in the calling expression.
Result tree fragments are passed as DocumentFragments. You can call the
getOwnerDocument() method to get an appropriate factory for creating result
tree nodes. You can also cast the DocumentFragment to a
com.lotus.xsl.ResultTreeFrag
.
Having some sort of result tree fragment is the only good way of
creating nodes for insertion into the result tree. Otherwise you can simply
return a string or number. In the future we will have a way to write directly
into the output stream.
XSLT variables can hold any return from an extension function, and can be
used later for passing into other extension functions.
In Java, you can call static functions or member functions. If you wish to
call a member function, the first argument will be used as the this
reference. An example:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"
xmlns:date="http://java.sun.com/products/jdk/1.1/docs/api/java.util.Date.html">
<xsl:functions ns="date" type="application/java" classid="java.util.Date"/>
<xsl:template match="/">
<HTML>
<H1>Simple test for creating an instance of a Java object.</H1>
<HR/>
<P>Should print the current date:</P>
<P><xsl:value-of select="date:toString(date:new())"/></P>
</HTML>
</xsl:template>
</xsl:stylesheet>
Notice that new() is used to construct a new instance.
You can see more examples of calling extensions in the testsuite\ext directory.
The previous proprietary features of LotusXSL have been replaced by standard features
in XSLT.
This section will give you an idea of what I haven't implemented yet.
-
Template elements aren't constrained to the result namespace declared
with result-ns.
-
For number formatting, I don't yet handle the letter-value, digit-group-sep,
and n-digits-per-group, and sequence-src attributes. Also, I suspect my
internationalization support for number is not all that hot.
-
I don't give file and line number information when errors occur. This
is a major problem, and I hope to find a solution, at least when LotusXSL
is used with XML4J.
-
xsl:locale is not yet implemented.
Bugs I haven't been able to fix yet for one reason or
the other.
-
You have to create a new XSLProcessor class each time you
run the processor. This is considered a high priority issue.
-
Processing with validation turned on does not work with when using
the 2.0.9 version of XML4J. This
is an issue with XML4J, and is being addressed by that team.
-
Namespace resolution of attributes doesn't work when using the
XML4JLiaison4dom liaison.
There are lots of potential features that will be going into the
draft. Rather than trying to enumerate these, I'll enumerate what I
plan to do that is not driven by the draft.
-
Performance is an ongoing task....
-
Control of output charset.
-
Finish setStyleSheet() API.
-
Work on incremental rendering via transformations as the source tree
is arriving.
-
Examples directory!
-
XSL Tutorial!
-
I want to put in an editor's interface, for use by XML/XSL editors. This
would (1) allow a stream interface on the result-tree DOM, and (2) allow
structural changes in the source tree to be incrementally updated in the
result tree, with proper events thrown, etc.
-
Directly related to the above item, a Rule Locator (for want of better term).
This needs to be able to locate closest matching rules for actions
when a given source node changes, for editing situations. This is
easy when only patterns are used, but harder when selects and modes
are used. May require some special interfacing to the output DOM.
-
Internationalization.
-
Better documentation.
July 14, 1999 (Version 0.17.4)
-
Fixed setPreserveSpace call in the XML4J 1.1.16 liaison.
-
Put defensive code in XSLProcessor.fixWhiteSpace.
-
Added knowlege of no-value attributes to the HTML processor, like "disabled".
-
Fixed bug where it wasn't creating the formatter listener for process calls that create a DOM.
-
Added setExpandEntityReferences call to XML4JLiaison4dom.
-
Removed check for document node type in XMLParserLiaisonDefault getParentOfNode.
June 24, 1999 (Version 0.17.3)
-
New code provides base servlet support to apply XSL stylesheets
(retrieved from various sources) to XML (also retrieved from various
sources).
-
Fixed: rather nasty bug having to do with union with match patterns
that are non-simple.
-
Fixed: casting of variables in equality expressons had some problems,
leading to fatal errors for valid syntax.
-
Fixed: when duplicate attributes were being added, this was not checked.
-
Fixed: when attributes were added after a child of the element had been
added, the attributes were being added to the next occuring
element.
-
Fixed: idref() was working incorrectly -- it didn't parse multiple
IDs in the same attribute.
-
Fixed: With system paths meant for Unix, the direction of
the slashes could cause hard to diagnose problems. The slashes
are now normalized.
June 15, 1999 (Version 0.17.2)
-
Fixed nasty problem with equality expressions, where the cast wasn't
being done correctly, which would yeald incorrect results.
-
Fixed problem with using full path expressions (including '.')
after a '//'. (The problem is the differences of handling '//'
vs. from-descendents(), which are similar enough to share code, yet
their arguments turn out to be different).
-
Made NOREPORTPARSEERROR, etc., public.
-
Added hack for IMG tag for HTML FormatterListener so
it doesn't add extra linefeeds around this tag.
-
Fixed being able to turn indenting off via use of
indent-result="no" (this still will not work if result-ns is not
set and the -HTML flag is used, unfortunately).
-
Fixed problem with copying result-tree fragments from
variables to the result tree
-
Fixed problem with param context being wrong.
-
Override getNamespaceOfNode when using XML4JLiaison4dom
and make namespace prefix resolution not work with attributes,
since the DOM (and the XML4J DOM) is broken in regards to getting
the parent of an attribute.
-
Fixed problem with attributes being propagated up when used with
result tree fragments.
-
Fixed problem with parameters being passed to extensions.
-
Fixed several parsing problems.
-
Fixed problem with optimization of simple queries,
where it would select the wrong thing.
-
Hopefully fixed problem with using JavaScript in threaded situations.
-
Fixed whitespace stripping problems.
-
Fixed substring-after bug.
May 24, 1999 (Version 0.17.1)
-
Carriage return/linefeed normalization is now off by default.
-
Added -STRIPCDATA and -ESCAPECDATA command line switches.
-
No longer force case change when in HTML mode.
-
Only escape "\n\r" for HTML attributes.
-
Fixed several defects with xsl:copy-of.
-
Fixed several defects with expression parsing when
using predicates with axes identifiers.
-
Several low-hanging-fruit performance enhancements.
-
Fixed bug where non-elements that were named the
same as elements would match on element nodetests.
The primary manifestation of this was the doc rule
firing twice when a DOCTYPE declaration was present.
-
Updated the xsl-html DTD (Thanks Henrique!).
-
Added run.ksh (Thanks Bill!).
May 3, 1999 (Version 0.17.0)
-
Validation is now off by default. -VALIDATE will turn it on.
-
You can now set the formatter from the command line.
-
Added setStylesheetParam() function.
For the moment, only one param is supported.
-
Better trace methods.
-
-edump switch to tell if a stack dump is done.
-
Major rewrite to support the April 22 XSLT draft.
April 7, 1999 (Version 0.16.4)
- Upgraded to new version of the JavaScript engine.
- Use wait/notify in LotusXSLControl to call the trusted thread.
April 2, 1999 (Version 0.16.4)
- Completed SAX output feature. Adapted process() calls that
take a writer to stream directly to SAX.
- Fixed problem with xml: prefix in the generic DOM liaison.
March 22, 1999 (Version 0.16.4)
- In ProcessXSL, Automatically launch the XML4J 2.0.X TX compatibility liaison
if the version check fails. I can't do the inverse because the
2.0.X liaison won't load if XML4J 1.1.14 is present.
- Bottle-necked all printing to the XMLParserLiasonDefault, and
thus to FormatterToXML and FormatterToHTML. You now must use
-xml4jprint if you want to use the XML4J PrintVisitor classes.
- Better whitespace handling.
- The caller can now control what characters are escaped in
attributes.
- Did some work to result-tree namespace handling... it now
works much better with xsl:copy.
March 11, 1999
- Fixed first-of-type and last-of-type: they were using
getElementsByTagName, which get's elements by descendents rather
than by children, thus failing if the list had children of the children
being tested of the given type.
March 11, 1999 (Version 0.16.4d1)
- Added undocumented -SSATV switch that lets you have AVTs
interpreted in selects.
March 11, 1999 (Version 0.16.3)
- Fixed problem with XMLParserLiaisonDefault in getNamespaceOfNode
where it wasn't finding the parents of attributes.
- Fixed problem in FormatterToHTML where it wasn't closing
non-empty tags that didn't have children.
- Fixed regression in query engine for the "/|etc" bug.
- Fixed defect reported by Gunnar Teege:
the select pattern "tml:re/id('st')"
produces a StringIndexOutOfBoundsException in the QueryEngine
tokenizer. Fix made in QueryEngine's tokenize method.
- Added Bourne scripts.
March 10, 1999
- Updated XML4J DOM liaison to XML4J 2.0.3.
- Fixed XML4J versioning checks.
- Catch exception when add of text nodes to Document node fails,
and give warning.
March 8, 1999
- Fixed nasty defect where patterns like "/|etc" would not work... anything where
the root ('/') was followed by the '|' symbol.
- When used with the HTML formatters, or the FormatterToXML class (used
for non-tx serialization to XML), the single quote and 0x0A and 0x0D are
escaped in attributes.
- Fixed ugly defect where anything besides the document element
root could not be selected.
- Fixed bug where the close tag would sometimes not be added in
the FormatterToHTML.
- Moved indent handling up to the level of FormatterToXML.
March 3, 1999
- In the TrustedAgent inside the LotusXSLControl, fall to sleep while
waiting so you don't take all the CPU time (thanks be to Jinbo Chen for
this).
March 2, 1999
- Fixed problem with comma tokens in query engine.
- Made extension calls not found into warnings in query engine.
This fix and the one above fixes problems with the call() function.
- Used element instead of DocumentFragment when doing early evaluation
of xsl:macro contents, and also temporarily parent the element to the
current result tree node. This fixes a defect where a
java.lang.RuntimeException: Child does not have parent! error could
occur with directives inside xsl:invoke.
- Moved the LotusXSLControl class into the com.lotus.xsl.client package.
- Fixed most JavaDoc errors.
- Use Jikes to compile release version.
February 28, 1999
- Fixed problem with use of base URI.
- Added constructors with XML error listeners on XMLParserLiaisons.
February 26, 1999
- Added -Q flag for quiet operation.
- Fixed the defect where extra space was being added
in xsl:attribute.
- Fixed three-deep-macro bug... the late evaluation of
xsl:contents was causing the incorrect contents to
be evaluated. The fix, to do early evaluation and then
clone the fragment into the result tree is less effecient.
I don't think this is worth any more work since xsl:contents
is going away in the next draft.
- The above also contains a fix for a related bug having to
do with the incorrect xsl:contents evaluation context.
- Require value-of and for-each to have a select attribute.
- For the doc name param to ParseXML in the XMLParserLiaison,
allow null, also added another signature that doesn't have
the doc name param.
- Flag error when xsl:import occurs after some other stylesheet
element.
- Fixed use of relative URIs (I hope).
- Fixed base directory to be the directory of the
stylesheet instead of the processor.
- Began work on Formatter interface, which will eventually
become a SAX streaming output interface. Moved print function
to be implemented by this interface instead of by the
XMLParserLiaison. Made constructors for XSLProcessor that take
both a liaison and a formatter.
- Implemented xml4j2dom.XML4JLiaison4dom and
xml4j2tx.XML4JLiaison for compatibility with XML4J 2.0.
- Fixed bugs in XMLParserLiaisonDefault. Added formatter implementations
for this also.
February 08, 1999 (Version 0.16.2)
- Check attributes for non-existence by using getAttributeNode
and testing for NULL, necessary because XML4J 1.1.4 (correctly)
changed the return to an empty string when an attribute doesn't
exist.
- Rewrote pattern tokenizer by hand instead of using the
Java version, trying to get better performance...
- Added ID handling stuff, including going to a new
XMLParserLiaison interface to get the ID, if xsl:id isn't used. This
fixes a nasty bug when stylesheet writer expects the ID
to be recognized from the stylesheet. Notice that XML4J doesn't
recognize attributes specified as IDs unless in validation mode.
When using one of the process methods that use a URL for
the XML, thus making the liaison do the parsing, scan for xsl:id's
while the parse is occurring.
- Added -NV flag to turn off validation..., which is on
by default.
- Pre expand namespace prefixes for XSL tag lookups, then
do lookups based on value from getExpandedName... a small increase
in performance.
- If the caller says it's OK, use the UserData field in
the TX Child class to cache the expanded names of prefixes...
a good performance improvement. This is off by default.
- Made default for XML4J version 1.1.14. 1.1.9 should give
off a warning.
- Did various other optimizations, esp. in query engine and
XMLParserLiaison.
- Fixed defect in cascading for attribute sets.
- Removed carriage return/linefeed normalization as default.
Use -CR and -LF to normalize.
- Fixed defect on secondary key sorts with xsl:sort.
- Added xsl-html.dtd. Thanks be to Henrique M. Holschuh for this.
- Added readme.dtd. Thanks be to Don Day for this.
February 01, 1999
-
Use mergesort instead of quicksort for sorting. Because of glitch
I still have to sort by doc order when elements are equal. When
strings are used in a number sort, I imitate XT, though I'm not
absolutely sure this is the right handling (a phone number is
interpreted as a number...).
Sorting should have no bugs left in it, though performance is
not what I would like yet.
-
Worked on xsl:number performance... achieved some improvement.
Tried to implement count cache, but realized it's nearly
impossible, and not the right thing to do.
-
Pass file name to ProcessXSL#parseXMLStream for better
error messages.
-
Added QC switch to suppress pattern conflict warnings.
-
Do version check for >= 1.1.9 of XML4J. I might have to
revisit this a bit for next version of XML4J.
-
Put switches in and API functions to control if Carriage returns
or linefeeds are used in the output. Default is CR/LF.
-
Tried to clarify the docs for process API that input trees are
imutable and result tree is the same one that is handed in, if
one is handed in.
-
Implemented generic XMLProcessorLiaison, and made
com.lotus.xsl.xml4j.ProcessXSL derive from it. Though functions
are written to handle namespaces with a generic DOM, I have
not tested them yet.
-
Added more error handling in several places.
-
Improved error reporting for patterns.
-
Fixed baz[foo=""].
-
Fixed handling of multiple input IDs when they come as the
result of a select pattern.
-
Fixed handling of AndExpr and OrExpr, which I incorrectly
interpreted from the BNF. Thanks be to Craig for this.
-
Fixed silly 'XML' that should be 'XSL' when warning or flagging
an error.
-
Implemented XML4J-style version numbering.
January 25, 1999
-
xsl:apply-imports has been implemented.
-
Namespace quoting for the result tree, and general result
tree namespace handling has been implemented.
-
Fixed bug with file opening for nested imports.
-
Fixed bug where '/' root anchors didn't work for match patterns.
-
Whitespace normalized to LF/CR for character-level fidelity with XT.
-
Whitespace bug fixed where whitespace outside of root was being added.
January 21, 1999
-
xmlns="http://www.w3.org/TR/REC-html40" result-ns="" now works
for the LotusXSLControl applet class.
-
Fixed: Kill extra linefeeds.
For the most part, I now have character-by-character whitespace
equality with XT output. There's one small glitch when
comments are found in the templates - an extra space is added.
-
Fixed: Bug with 'from' attribute in xsl:number
-
Fixed: Bug with count attribute default.
-
Fixed: Incorrect match in test17. Something to do with //.
-
Fixed: Attribute value templates should be constrained to the following types
of attributes:
-
All literal result element attributes.
-
name attribute in xsl:element.
-
name attribute in xsl:attribute.
-
name attribute in xsl:pi.
-
order, lang, data-type, case-order in xsl:sort.
-
Number-to-string conversion attributes in xsl:number, xsl:counter, and xsl:counters.
-
value attribute in xsl:constant.
-
value attribute of xsl:arg.
-
default attribute of xsl:macro-arg (I think).
-
Fixed: <xsl:if test=""> generates a null pointer exception.
-
Fixed: Better Error message for when XML4J not found.
-
Fixed: Comments inside macros should not be written to result tree.
-
Fixed: Fixed realestate demo. It now uses a newly added
setStyleSheetAttribute() method.
-
Fixed: Kill extra linefeeds.
-
Fixed: Bugs in ancestor() and ancestor-or-self().
-
Fixed: Null pointers for empty select or match expressions.
-
Fixed: ID not found trying to process parent of document element.
-
Fixed: Indent result attribute not processed correctly.
-
A bit better error detection for bad patterns. Still have some
major work to do on this front.
-
Fixed: Compile error with Java 1.2.
-
Fixed: Getting the attribute of an ancestor doesn't work in the new version..
-
Fixed: When you don't specify an output file on the command line, a null pointer exception is thrown rather than printing the output to System.out as it used to do.
-
Added -v switch to give version info.
-
Started errors portion of testsuite (but only have three cases so far).
January 15, 1999
-
Major API cleanup
-
Handling of namespaces in patterns
-
Importance fixed for Macro, Constant, etc.
-
Made nodes non-sticky, as they're supposed to be.
-
Empty attributes are now properly copied into the result tree.
-
Stylesheet comments are no longer being automatically copied into the result tree.
-
Some XT compatibility tested (more to go).
-
Use HTML Print Vistor when result-ns="HTML"
-
Parent of document element is incorrect is fixed
-
Worked on whitespace
-
Added SelectExpr for uri()
-
bug - test1, a & a[emph] should have conflict fixed
-
Bug with not showing conflict with "*" and "foo" fixed
-
Don't use default namespace for element type names in patterns
-
Fix Attr return null for getParentNode
-
Implemented ancestor-or-self
-
Implement Error Handlers (test7)
-
Implement style PI in ProcessXML
-
Removed attribute copy on xsl:copy
-
Removed old syntax support
-
Reviewed and add source code comments
-
Turned Entity Expansion on in XML parser
-
Implemented XSL/XML Exception throwing
-
And a bunch of other bugs fixed along the way.
December 20, 1998
-
Fixed result tree counting so it doesn't take the name attribute as
a result tree element name.
-
Implemented counter-scope.
-
Fixed a problem with conflict resolution with "*" and element patterns.
December 17, 1998
-
Implemented handling of the stylesheet PI in the XML doc from ProcessXSL.
-
Fixed xsl:copy so that it does not automatically copy attributes that
are not xmlns.
December 15, 1998
-
Added proper ID syntax and semantics for new draft -- IDs must be quoted, or they will
be interpeted as patterns.
-
Added lotusxsl:css-style-conversion support as stylesheet
element, and removed -T support.
-
Fixed bug with select qualifiers on text(), attributes, pi's, doc nodes, and comments.
-
Implemented result tree counting. Not sure I have it right.
-
Implemented sorting (xsl:sort).
December 11, 1998
-
Added Process() APIs on com.lotus.xsl.xml4.ProcessXSL.
-
Did some stuff with whitespace. Defaulted indent to zero,
made it so whitespace is only stripped from attributes and
value-of based on the normal XSL whitespace dance, did callback
to XMLParserLiaison for isIgnorableWhitespace, so it can strip
these nodes.
-
Added public getQueryEngine() call to XSLProcessor.
November 28, 1998 to 18-May-1998
-
Details deleted.
18-May-1998 to 30-June-1998
-
Old submission version. Details deleted.
-
Lotus XML Contact Person:
Noah Mendelsohn
-
IBM Representatives to the XSL W3C Working Group:
Sanjiva Weerawarana
and Don Day
-
Contact information for myself:
Scott Boag
Lotus Development Corporation
One Rogers Street
Cambridge, MA, 02142-1245
(voice) 617-693-5295
(fax) 617-693-8676
(email) scott_boag@lotus.com
- XSL Instruction
- Any tag with an XSL namespace prefix.
- XSL Template Instruction
- Any tag with an XSL namespace prefix
that occurs inside an xsl:template element.
- Template Child
- Any node that is a child of an xsl:template element.
- Source Tree
- The tree input to the XSL process.
- Result Tree
- The tree that is output by the XSL process.
- Stylesheet Tree
- The stylesheet tree produced from the XSL file.
- Pattern List
- A parsed query or match pattern.