Jump to content

XSLT

From Wikipedia, the free encyclopedia

This is an old revision of this page, as edited by 195.6.25.120 (talk) at 15:42, 12 December 2006 (The article "Binary and text files" no longer exists. Changed link to "Plain text" article instead.). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

XSL Transformations
Filename extension
.xsl, .xslt
Internet media type
application/xslt+xml (Waiting for approval), text/xsl (unregistered)
Developed byWorld Wide Web Consortium
Type of formatStylesheet language
Extended fromXML
Standard1.0 (Recommendation),
2.0 (Proposed Recommendation)
Diagram of the basic elements and process flow of Extensible Stylesheet Language Transformations.

Extensible Stylesheet Language Transformations (XSLT) is a Turing complete[1][2] XML-based language used for the transformation of XML documents.

XSLT is a specific kind of template processor primarily designed to "transform" XML documents into other XML documents. The original document is not changed; rather, a new document is created based on the content of an existing one.[3] The new document may be serialized (output) by the processor in standard XML syntax or in another format, such as HTML or plain text.[4] XSLT is most often used to convert data between different XML schemas or to convert XML data into HTML or XHTML documents for web pages, or into an intermediate XML format that can be converted to PDF documents.

As a language, XSLT's origins lie in functional language [5], and in text-based pattern matching languages in the tradition of SNOBOL and awk. Its most direct predecessor was DSSSL, a language that performed the same function for SGML as XSLT performs for XML.

XSLT was produced as a result of the Extensible Stylesheet Language (XSL) development effort within W3C during 19981999, which also produced XSL Formatting Objects (XSL-FO) and the XML Path Language, XPath. The editor of the first version (and in effect the chief designer of the language) was James Clark. The version most widely used today is XSLT 1.0, which was published as a Recommendation by the W3C on 16 November 1999. A greatly expanded version 2.0, under the editorship of Michael Kay, reached the status of Proposed Recommendation from the W3C on 21 November 2006.

Overview

The XSLT processing model traditionally involves:

  • one or more XML source document files (data model);
  • one or more XSLT stylesheet files (processing templates);
  • the XSLT template processing engine (the processor); and
  • one or more result output documents.

In some deployments, there may be slight variations on this traditional framework. For example, when deployed on top of a scripting language or command shell, the XML and XSLT input may not consist of files. In some instances, an XML input stream may not be specified at all.

The XSLT processor ordinarily takes two input files[6] – an XML source document, and an XSLT stylesheet – and produces an output document. The XSLT stylesheet contains the XSLT program text (or ‘source code’ in other languages) and is itself an XML document that describes a collection of template rules: instructions and other hints that guide the processor toward the production of the output document.

Template rule processing

The XSLT language is declarative — rather than listing an imperative sequence of actions to perform in a stateful environment, template rules only define how to handle a node matching a particular XPath-like pattern if the processor should happen to encounter one, and the contents of the templates effectively comprise functional expressions which directly represent their evaluated form: the result tree, which is the basis of the processor's output.

The processor follows a fixed algorithm: Assuming a stylesheet has already been read and prepared, the processor builds a source tree from the input XML document. It then starts by processing the source tree's root node, finding in the stylesheet the best-matching template for that node, and evaluating the template's contents. Instructions in each template generally direct the processor to either create nodes in the result tree, or process more nodes in the source tree in the same way as the root node. Output is derived from the result tree.

Processor implementations

XSLT processors may be delivered as standalone applications, or as software components or libraries intended for use by applications. Many web browsers and web server software have XSLT processor components built into them.

Most current operating systems have an XSLT processor installed. For example, Windows XP comes with the MSXML3 library, which includes an XSLT processor. Earlier versions may be upgraded and there are many alternatives, see the External Links section.

Early XSLT processors had very few optimizations; stylesheet documents were read into Document Object Models and the processor would act on them directly. XPath engines were also not optimized.

By 2000, however, implementors saw optimization opportunities in both XPath evaluation and template rule processing. For example, the Java programming language's Transformation API for XML (TrAX), later subsumed into the Java API for XML Processing (JAXP), acknowledged one such optimization: before processing, the XSLT processor could condense the template rules and other stylesheet tree information into a single, compact Templates object, free from the constraints and bloat of standard DOMs, in an implementation-specific manner. This intermediate representation of the stylesheet tree allows for more efficient processing by potentially reducing preparation time and memory overhead. Additionally, the formal API allows for the object to be cached and reused for multiple transformations, potentially providing higher performance if several input documents are to be processed with the same XSLT stylesheet. Parallels are often drawn between this optimization and the compilation of programming language source code to bytecode: the stylesheets are said to be "compiled", even though they don't usually produce native programming language bytecode; rather, they produce intermediate structures and routines that are stored and processed internally.[7]

XPath evaluation also has room for significant optimizations, and most processor vendors have implemented at least some of them, for speed. For example, in <xsl:if test="/some/nodes"> the test will evaluate to true if /some/nodes identifies any nodes, so evaluation can stop as soon as the first matching node is found; continuing to look for the entire set of matching nodes would not change the result. Similar optimizations can be undertaken when processing xsl:when and xsl:value-of, as well as expressions relying on, either implicitly or explicitly, string(), boolean(), or number(), and those that use numeric and position()/last()-based predicates.

Specification

The XSLT specification defines a transformation in terms of source and result trees to avoid locking implementations into system-specific APIs and memory, network and file I/O issues. For example, the specification does not mandate that a source tree always be derived from an XML file, since it may be more efficient for the processor to read from an in-memory DOM object or some other implementation-specific representation. Output may be in a format not envisioned by the XSLT language's designers. However, XSLT processing often begins by reading a serialized XML input document into the source tree and ends by writing the result tree to an output document. The output document may be XML, but can be HTML, RTF, TeX, delimited files, plain text or other formats.

XSLT relies upon the W3C's XPath language for identifying subsets of the source document tree, as well as for performing calculations. XPath also provides a range of functions, which XSLT itself further augments. This reliance upon XPath adds a great deal of power and flexibility to XSLT.

The W3C finalized the XSLT 1.0 specification in 1999. The XSLT 2.0 specification is currently a Proposed Recommendation.

Examples

Sample of incoming XML document

<?xml version="1.0" ?>
<persons>
  <person username="JS1">
    <name>John</name>
    <family_name>Smith</family_name>
  </person>
  <person username="MI1">
    <name>Morka</name>
    <family_name>Ismincius</family_name>
  </person>
</persons>

Example 1 (transforming XML to XML)

This XSLT stylesheet provides templates to transform the XML document:

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/> 

<xsl:template match="/">
       <root> <xsl:apply-templates/> </root>
</xsl:template>

<xsl:template match="//person">
	<name username="{@username}">
	   <xsl:value-of select="name" />
	</name>
</xsl:template>

</xsl:stylesheet>

Its evaluation results in a new XML document, having another structure:

<?xml version="1.0" encoding="UTF-8"?>
<root>
      <name username="JS1">John</name>
      <name username="MI1">Morka</name>
</root>

Example 2 (transforming XML to XHTML)

Example XSLT Stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/persons">
	<html xmlns="http://www.w3.org/1999/xhtml">
	<head> <title>xsl wiki ex.</title> </head>
	<body>
		<h1>Persons</h1>
		<ul><xsl:apply-templates /></ul>
	</body>
	</html>        
</xsl:template>

<xsl:template match="person">
	<li>
		<xsl:value-of select="family_name"/>, 
		<xsl:value-of select="name"/>		
	</li>        
</xsl:template>

</xsl:stylesheet>

XHTML output that this would produce (whitespace has been adjusted here for clarity):

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head> <title>xsl wiki ex.</title> </head>
<body>
	<h1>Persons</h1>
	<ul>
	   <li>Smith, John</li>
	   <li>Ismincius, Morka</li>
	</ul>
</body>
</html>
  File:Xslt ex2.gif
How the XHTML appears when rendered in a web browser.

Note: In this particular example empty elements, such as the meta element in the head, include a space before the final />, as was specified in the XSLT stylesheet. This behavior is not required by the W3C specification for XSLT 1.0 processors, and so these spaces in Literal Result Elements[8] in XSLT may or may not be reproduced in the output depending on different XSLT processor implementations. The presence of this space in empty elements was specified in the HTML Compatibility Guidelines of the XHTML 1.0 specification[9] for serving XHTML 1.0 to non-XHTML-capable browsers with a 'text/html' Internet media type. It is not applicable to later versions of XHTML or XHTML served as 'application/xhtml+xml'[10]. It is not relevant to the most recent browsers (IE 7, Mozilla Firefox etc). XSLT 2.0 plans to address the problem by providing an 'xhtml' output method.[11]

References

  1. ^ http://www.unidex.com/turing/utm.htm
  2. ^ http://www.refal.net/~korlukov/tm/
  3. ^ http://www.w3.org/TR/xslt#section-Introduction
  4. ^ See e.g., http://www.w3.org/TR/xslt#output, specifying alternate output methods.
  5. ^ Dimitre Novatchev. "The Functional Programming Language XSLT - A proof through examples". TopXML. Retrieved May 27. {{cite web}}: Check date values in: |accessdate= (help); Unknown parameter |accessyear= ignored (|access-date= suggested) (help)
  6. ^ In this context, "document" and "file" refers to a file, a string, or any other recognizable input stream, not just a fixed file.
  7. ^ Saxon: Anatomy of an XSLT processor - An article describing the implementation and optimization details of a popular Java-based XSLT processor.
  8. ^ http://www.w3.org/TR/xslt#literal-result-element
  9. ^ http://www.w3.org/TR/2002/REC-xhtml1-20020801/#guidelines
  10. ^ http://www.w3.org/TR/xhtml-media-types/#media-types
  11. ^ http://www.w3.org/TR/xslt-xquery-serialization/#xhtml-output

See also

For implementations, see XML template engine.
Documentation
XSLT 1.0 W3C Recommendation
XSLT 2.0 W3C Proposed Recommendation
Zvon XSLT 1.0 Reference
XSL Concepts and Practical Use by Norman Walsh
Tutorial from developerWorks (1 hour)
Zvon XSLT Tutorial
XSLT Tutorial
Quick tutorial
What kind of language is XSLT?
XSLT and Scripting Languages
Mailing lists
The XSLT mailing list hosted by Mulberrytech
Blogs
A commentary, news, and evangelism weblog devoted to XSLT
Books
XSLT by Doug Tidwell, published by O’Reilly (ISBN 0-596-00053-7)
XSLT Cookbook by Sal Mangano, published by O’Reilly (ISBN 0-596-00974-7)
XSLT Programmer's Reference (ISBN 1-86100-312-9) by Michael Kay (ISBN 1-86100-312-9)
XSLT 2.0 Web Development by Dmitry Kirsanov (ISBN 0-13-140635-3)
XSL Companion, 2nd Edition by Neil Bradley, published by Addison-Wesley (ISBN 0-201-77083-0)
XSLT and XPath on the Edge (Unlimited Edition) (ISBN 0-7645-4776-3) by Jeni Tennison, published by Hungry Minds Inc, U.S. (ISBN 0-7645-4776-3)
XSLT & XPath, A Guide to XML Transformations (ISBN 0-13-040446-2) by John Robert Gardner and Zarella Rendon, published by Prentice-Hall (ISBN 0-13-040446-2)
XSLT code libraries
EXSLT is a widespread community initiative to provide extensions to XSLT.
FXSL is a library implementing support for Higher-order functions in XSLT. FXSL is written in XSLT itself.