mirror of
https://gitlab.gnome.org/GNOME/libxslt
synced 2025-08-07 10:42:55 +03:00
Release of libxslt-1.1.27
* configure.in doc/symbols.xml doc/xslt.html: updated for the release * NEWS config.h.in doc/* */*.syms : regenerated
This commit is contained in:
@@ -8,7 +8,8 @@ H2 {font-family: Verdana,Arial,Helvetica}
|
||||
H3 {font-family: Verdana,Arial,Helvetica}
|
||||
A:link, A:visited, A:active { text-decoration: underline }
|
||||
</style><title>Library internals</title></head><body bgcolor="#8b7765" text="#000000" link="#a06060" vlink="#000000"><table border="0" width="100%" cellpadding="5" cellspacing="0" align="center"><tr><td width="120"><a href="http://swpat.ffii.org/"><img src="epatents.png" alt="Action against software patents" /></a></td><td width="180"><a href="http://www.gnome.org/"><img src="gnome2.png" alt="GNOME2 Logo" /></a><a href="http://www.w3.org/Status"><img src="w3c.png" alt="W3C logo" /></a><a href="http://www.redhat.com"><img src="redhat.gif" alt="Red Hat Logo" /></a><div align="left"><a href="http://xmlsoft.org/XSLT/"><img src="Libxslt-Logo-180x168.gif" alt="Made with Libxslt Logo" /></a></div></td><td><table border="0" width="90%" cellpadding="2" cellspacing="0" align="center" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3" bgcolor="#fffacd"><tr><td align="center"><h1>The XSLT C library for GNOME</h1><h2>Library internals</h2></td></tr></table></td></tr></table></td></tr></table><table border="0" cellpadding="4" cellspacing="0" width="100%" align="center"><tr><td bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td valign="top" width="200" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Main Menu</b></center></td></tr><tr><td bgcolor="#fffacd"><form action="search.php" enctype="application/x-www-form-urlencoded" method="get"><input name="query" type="text" size="20" value="" /><input name="submit" type="submit" value="Search ..." /></form><ul><li><a href="index.html">Home</a></li><li><a href="intro.html">Introduction</a></li><li><a href="docs.html">Documentation</a></li><li><a href="bugs.html">Reporting bugs and getting help</a></li><li><a href="help.html">How to help</a></li><li><a href="downloads.html">Downloads</a></li><li><a href="FAQ.html">FAQ</a></li><li><a href="news.html">News</a></li><li><a href="xsltproc2.html">The xsltproc tool</a></li><li><a href="docbook.html">DocBook</a></li><li><a href="API.html">The programming API</a></li><li><a href="python.html">Python and bindings</a></li><li><a href="internals.html">Library internals</a></li><li><a href="extensions.html">Writing extensions</a></li><li><a href="contribs.html">Contributions</a></li><li><a href="EXSLT/index.html" style="font-weight:bold">libexslt</a></li><li><a href="xslt.html">flat page</a>, <a href="site.xsl">stylesheet</a></li><li><a href="html/index.html" style="font-weight:bold">API Menu</a></li><li><a href="ChangeLog.html">ChangeLog</a></li></ul></td></tr></table><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Related links</b></center></td></tr><tr><td bgcolor="#fffacd"><ul><li><a href="tutorial/libxslttutorial.html">Tutorial</a>,
|
||||
<a href="tutorial2/libxslt_pipes.html">Tutorial2</a></li><li><a href="xsltproc.html">Man page for xsltproc</a></li><li><a href="http://mail.gnome.org/archives/xslt/">Mail archive</a></li><li><a href="http://xmlsoft.org/">XML libxml2</a></li><li><a href="ftp://xmlsoft.org/">FTP</a></li><li><a href="http://www.zlatkovic.com/projects/libxml/">Windows binaries</a></li><li><a href="http://garypennington.net/libxml2/">Solaris binaries</a></li><li><a href="http://www.explain.com.au/oss/libxml2xslt.html">MacOsX binaries</a></li><li><a href="http://bugzilla.gnome.org/buglist.cgi?product=libxslt">Bug Tracker</a></li><li><a href="http://codespeak.net/lxml/">lxml Python bindings</a></li><li><a href="http://cpan.uwinnipeg.ca/dist/XML-LibXSLT">Perl XSLT bindings</a></li><li><a href="http://www.zend.com/php5/articles/php5-xmlphp.php#Heading17">XSLT with PHP</a></li><li><a href="http://www.mod-xslt2.com/">Apache module</a></li><li><a href="http://sourceforge.net/projects/libxml2-pas/">Pascal bindings</a></li><li><a href="http://xsldbg.sourceforge.net/">Xsldbg Debugger</a></li></ul></td></tr></table><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>API Indexes</b></center></td></tr><tr><td bgcolor="#fffacd"><ul><li><a href="APIchunk0.html">Alphabetic</a></li><li><a href="APIconstructors.html">Constructors</a></li><li><a href="APIfunctions.html">Functions/Types</a></li><li><a href="APIfiles.html">Modules</a></li><li><a href="APIsymbols.html">Symbols</a></li></ul></td></tr></table></td></tr></table></td><td valign="top" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%"><tr><td><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table border="0" cellpadding="3" cellspacing="1" width="100%"><tr><td bgcolor="#fffacd"><h3>Table of contents</h3><ul><li><a href="internals.html#Introducti">Introduction</a></li>
|
||||
<a href="tutorial2/libxslt_pipes.html">Tutorial2</a></li><li><a href="xsltproc.html">Man page for xsltproc</a></li><li><a href="http://mail.gnome.org/archives/xslt/">Mail archive</a></li><li><a href="http://xmlsoft.org/">XML libxml2</a></li><li><a href="ftp://xmlsoft.org/">FTP</a></li><li><a href="http://www.zlatkovic.com/projects/libxml/">Windows binaries</a></li><li><a href="http://garypennington.net/libxml2/">Solaris binaries</a></li><li><a href="http://www.explain.com.au/oss/libxml2xslt.html">MacOsX binaries</a></li><li><a href="http://bugzilla.gnome.org/buglist.cgi?product=libxslt">Bug Tracker</a></li><li><a href="http://codespeak.net/lxml/">lxml Python bindings</a></li><li><a href="http://cpan.uwinnipeg.ca/dist/XML-LibXSLT">Perl XSLT bindings</a></li><li><a href="http://www.zend.com/php5/articles/php5-xmlphp.php#Heading17">XSLT with PHP</a></li><li><a href="http://www.mod-xslt2.com/">Apache module</a></li><li><a href="http://sourceforge.net/projects/libxml2-pas/">Pascal bindings</a></li><li><a href="http://xsldbg.sourceforge.net/">Xsldbg Debugger</a></li></ul></td></tr></table><table width="100%" border="0" cellspacing="1" cellpadding="3"><tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>API Indexes</b></center></td></tr><tr><td bgcolor="#fffacd"><ul><li><a href="APIchunk0.html">Alphabetic</a></li><li><a href="APIconstructors.html">Constructors</a></li><li><a href="APIfunctions.html">Functions/Types</a></li><li><a href="APIfiles.html">Modules</a></li><li><a href="APIsymbols.html">Symbols</a></li></ul></td></tr></table></td></tr></table></td><td valign="top" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%"><tr><td><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td><table border="0" cellpadding="3" cellspacing="1" width="100%"><tr><td bgcolor="#fffacd"><h3>Table of contents</h3><ul>
|
||||
<li><a href="internals.html#Introducti">Introduction</a></li>
|
||||
<li><a href="internals.html#Basics">Basics</a></li>
|
||||
<li><a href="internals.html#Keep">Keep it simple stupid</a></li>
|
||||
<li><a href="internals.html#libxml">The libxml nodes</a></li>
|
||||
@@ -29,7 +30,8 @@ A:link, A:visited, A:active { text-decoration: underline }
|
||||
</ul><h3><a name="Introducti2" id="Introducti2">Introduction</a></h3><p>This document describes the processing of <a href="http://xmlsoft.org/XSLT/">libxslt</a>, the <a href="http://www.w3.org/TR/xslt">XSLT</a> C library developed for the <a href="http://www.gnome.org/">GNOME</a> project.</p><p>Note: this documentation is by definition incomplete and I am not good at
|
||||
spelling, grammar, so patches and suggestions are <a href="mailto:veillard@redhat.com">really welcome</a>.</p><h3><a name="Basics1" id="Basics1">Basics</a></h3><p>XSLT is a transformation language. It takes an input document and a
|
||||
stylesheet document and generates an output document:</p><p align="center"><img src="processing.gif" alt="the XSLT processing model" /></p><p>Libxslt is written in C. It relies on <a href="http://www.xmlsoft.org/">libxml</a>, the XML C library for GNOME, for
|
||||
the following operations:</p><ul><li>parsing files</li>
|
||||
the following operations:</p><ul>
|
||||
<li>parsing files</li>
|
||||
<li>building the in-memory DOM structure associated with the documents
|
||||
handled</li>
|
||||
<li>the XPath implementation</li>
|
||||
@@ -46,7 +48,8 @@ the input tree from a serialization progressively as it is consumed,
|
||||
factoring repetitive patterns, or even on-the-fly generation of the output as
|
||||
the input is parsed but it is possible only for a limited subset of the
|
||||
stylesheets. In general the implementation of libxslt follows the following
|
||||
pattern:</p><ul><li>KISS (keep it simple stupid)</li>
|
||||
pattern:</p><ul>
|
||||
<li>KISS (keep it simple stupid)</li>
|
||||
<li>when there is a clear bottleneck optimize on top of this simple
|
||||
framework and refine only as much as is needed to reach the expected
|
||||
result</li>
|
||||
@@ -58,12 +61,14 @@ keep this a flexible interface) and hence avoid the memory consumption of the
|
||||
result.</p><h3><a name="libxml" id="libxml">The libxml nodes</a></h3><p>DOM-like trees, as used and generated by libxml and libxslt, are
|
||||
relatively complex. Most node types follow the given structure except a few
|
||||
variations depending on the node type:</p><p align="center"><img src="node.gif" alt="description of a libxml node" /></p><p>Nodes carry a <strong>name</strong> and the node <strong>type</strong>
|
||||
indicates the kind of node it represents, the most common ones are:</p><ul><li>document nodes</li>
|
||||
indicates the kind of node it represents, the most common ones are:</p><ul>
|
||||
<li>document nodes</li>
|
||||
<li>element nodes</li>
|
||||
<li>text nodes</li>
|
||||
</ul><p>For the XSLT processing, entity nodes should not be generated (i.e. they
|
||||
should be replaced by their content). Most nodes also contains the following
|
||||
"navigation" information:</p><ul><li>the containing <strong>doc</strong>ument</li>
|
||||
"navigation" information:</p><ul>
|
||||
<li>the containing <strong>doc</strong>ument</li>
|
||||
<li>the <strong>parent</strong> node</li>
|
||||
<li>the first <strong>children</strong> node</li>
|
||||
<li>the <strong>last</strong> children node</li>
|
||||
@@ -76,14 +81,16 @@ entities references).</p><p>The <strong>ns</strong> points to the namespace decl
|
||||
namespace associated to the node, <strong>nsDef</strong> is the linked list
|
||||
of namespace declaration present on element nodes.</p><p>Most nodes also carry an <strong>_private</strong> pointer which can be
|
||||
used by the application to hold specific data on this node.</p><h3><a name="XSLT" id="XSLT">The XSLT processing steps</a></h3><p>There are a few steps which are clearly decoupled at the interface
|
||||
level:</p><ol><li>parse the stylesheet and generate a DOM tree</li>
|
||||
level:</p><ol>
|
||||
<li>parse the stylesheet and generate a DOM tree</li>
|
||||
<li>take the stylesheet tree and build a compiled version of it (the
|
||||
compilation phase)</li>
|
||||
<li>take the input and generate a DOM tree</li>
|
||||
<li>process the stylesheet against the input tree and generate an output
|
||||
tree</li>
|
||||
<li>serialize the output tree</li>
|
||||
</ol><p>A few things should be noted here:</p><ul><li>the steps 1/ 3/ and 5/ are optional: the DOM representing the
|
||||
</ol><p>A few things should be noted here:</p><ul>
|
||||
<li>the steps 1/ 3/ and 5/ are optional: the DOM representing the
|
||||
stylesheet and input can be created by other means, not just by parsing
|
||||
serialized XML documents, and similarly the result tree DOM can be
|
||||
made available to other processeswithout being serialized.
|
||||
@@ -142,7 +149,8 @@ etc. Those are stored independently in the stylesheet structure as separate
|
||||
linked lists of xsltCompMatch.</p><h3><a name="processing" id="processing">The processing itself</a></h3><p>The processing is defined by the XSLT specification (the basis of the
|
||||
algorithm is explained in <a href="http://www.w3.org/TR/xslt#section-Introduction">the Introduction</a>
|
||||
section). Basically it works by taking the root of the input document
|
||||
as the cureent node and applying the following algorithm:</p><ol><li>Finding the template applying to current node.
|
||||
as the cureent node and applying the following algorithm:</p><ol>
|
||||
<li>Finding the template applying to current node.
|
||||
This is a lookup in the template hash table, walking the hash list until
|
||||
the node satisfies all the steps of the pattern, then checking the
|
||||
appropriate global template(s) (i.e. templates applying to a node type)
|
||||
@@ -150,13 +158,15 @@ as the cureent node and applying the following algorithm:</p><ol><li>Finding the
|
||||
<li>If there is no template, apply the default rule (recurse on the
|
||||
children as the current node)</li>
|
||||
<li>else walk the content list of the selected templates, for each of them:
|
||||
<ul><li>if the node is in the XSLT namespace then the node has a _private
|
||||
<ul>
|
||||
<li>if the node is in the XSLT namespace then the node has a _private
|
||||
field pointing to the preprocessed values, jump to the specific
|
||||
code</li>
|
||||
<li>if the node is in an extension namespace, look up the associated
|
||||
behavior</li>
|
||||
<li>otherwise copy the node.</li>
|
||||
</ul><p>The closure is usually done through the XSLT
|
||||
</ul>
|
||||
<p>The closure is usually done through the XSLT
|
||||
<strong>apply-templates</strong>construct, which invokes this process
|
||||
recursively starting at step 1, to find the appropriate template
|
||||
for the nodes selected by the 'select' attribute of the apply-templates
|
||||
@@ -167,7 +177,8 @@ as the cureent node and applying the following algorithm:</p><ol><li>Finding the
|
||||
stylesheet and that conversely some may be processed multiple times.
|
||||
(This often is the case when a Table of Contents is built).</p><p>The module <code>transform.c</code> is the one implementing most of this
|
||||
logic. <strong>xsltApplyStylesheet()</strong> is the entry point, it
|
||||
allocates an xsltTransformContext containing the following:</p><ul><li>a pointer to the stylesheet being processed</li>
|
||||
allocates an xsltTransformContext containing the following:</p><ul>
|
||||
<li>a pointer to the stylesheet being processed</li>
|
||||
<li>a stack of templates</li>
|
||||
<li>a stack of variables and parameters</li>
|
||||
<li>an XPath context</li>
|
||||
@@ -215,7 +226,8 @@ the KISS approach again. It's recursive and calls
|
||||
evaluating a <code>COLLECT</code> node.</p><p>An evaluation is done within the framework of an XPath context stored in
|
||||
an <strong>xmlXPathContext</strong> structure, in the framework of a
|
||||
transformation the context is maintained within the XSLT context. Its content
|
||||
follows the requirements from the XPath specification:</p><ul><li>the current document</li>
|
||||
follows the requirements from the XPath specification:</p><ul>
|
||||
<li>the current document</li>
|
||||
<li>the current node</li>
|
||||
<li>a hash table of defined variables (but not used by XSLT,
|
||||
which uses its own stack frame for variables, described below)</li>
|
||||
@@ -249,7 +261,8 @@ function hash table linked from the XPath context. They all share the same
|
||||
signature:</p><pre>void xmlXPathFunc (xmlXPathParserContextPtr ctxt, int nargs);</pre><p>The first argument is the XPath interpretation context, holding the
|
||||
interpretation stack. The second argument defines the number of objects
|
||||
passed on the stack for the function to consume (last argument is on top of
|
||||
the stack).</p><p>Basically an XPath function does the following:</p><ul><li>check <code>nargs</code> for proper handling of errors or functions
|
||||
the stack).</p><p>Basically an XPath function does the following:</p><ul>
|
||||
<li>check <code>nargs</code> for proper handling of errors or functions
|
||||
with variable numbers of parameters</li>
|
||||
<li>pop the parameters from the stack using <code>obj =
|
||||
valuePop(ctxt);</code></li>
|
||||
@@ -279,7 +292,8 @@ libxslt.</p><p>The <a href="http://xmlsoft.org/">libxml documentation</a>, espec
|
||||
execution time. Similarly for the attribute value templates handling, at
|
||||
least the embedded subexpressions ought to be precompiled.</p><p>Allow output to be saved to a SAX like output (this notion of SAX like API
|
||||
for output should be added directly to libxml).</p><p>Implement and test some of the optimization explained by Michael Kay
|
||||
especially:</p><ul><li>static slot allocation on the stack frame</li>
|
||||
especially:</p><ul>
|
||||
<li>static slot allocation on the stack frame</li>
|
||||
<li>specific boolean interpretation of an XPath expression</li>
|
||||
<li>some of the sorting optimization</li>
|
||||
<li>Lazy evaluation of location path. (this may require more changes but
|
||||
|
Reference in New Issue
Block a user