preparing release 1.0.13 updated and rebuilt the docs fixed a possible
[platform/upstream/libxslt.git] / doc / python.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
2 <html>
3 <head>
4 <meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
5 <style type="text/css"><!--
6 TD {font-family: Verdana,Arial,Helvetica}
7 BODY {font-family: Verdana,Arial,Helvetica; margin-top: 2em; margin-left: 0em; margin-right: 0em}
8 H1 {font-family: Verdana,Arial,Helvetica}
9 H2 {font-family: Verdana,Arial,Helvetica}
10 H3 {font-family: Verdana,Arial,Helvetica}
11 A:link, A:visited, A:active { text-decoration: underline }
12 --></style>
13 <title>Python and bindings</title>
14 </head>
15 <body bgcolor="#8b7765" text="#000000" link="#000000" vlink="#000000">
16 <table border="0" width="100%" cellpadding="5" cellspacing="0" align="center"><tr>
17 <td width="100">
18 <a href="http://www.gnome.org/"><img src="smallfootonly.gif" alt="Gnome Logo"></a><a href="http://www.redhat.com"><img src="redhat.gif" alt="Red Hat Logo"></a>
19 </td>
20 <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">
21 <h1>The XSLT C library for Gnome</h1>
22 <h2>Python and bindings</h2>
23 </td></tr></table></td></tr></table></td>
24 </tr></table>
25 <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>
26 <td valign="top" width="200" bgcolor="#8b7765"><table border="0" cellspacing="0" cellpadding="1" width="100%" bgcolor="#000000"><tr><td>
27 <table width="100%" border="0" cellspacing="1" cellpadding="3">
28 <tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Main Menu</b></center></td></tr>
29 <tr><td bgcolor="#fffacd"><ul>
30 <li><a href="index.html">Home</a></li>
31 <li><a href="intro.html">Introduction</a></li>
32 <li><a href="docs.html">Documentation</a></li>
33 <li><a href="bugs.html">Reporting bugs and getting help</a></li>
34 <li><a href="help.html">How to help</a></li>
35 <li><a href="downloads.html">Downloads</a></li>
36 <li><a href="FAQ.html">FAQ</a></li>
37 <li><a href="news.html">News</a></li>
38 <li><a href="xsltproc2.html">The xsltproc tool</a></li>
39 <li><a href="docbook.html">DocBook</a></li>
40 <li><a href="API.html">The programming API</a></li>
41 <li><a href="python.html">Python and bindings</a></li>
42 <li><a href="internals.html">Library internals</a></li>
43 <li><a href="extensions.html">Writing extensions</a></li>
44 <li><a href="contribs.html">Contributions</a></li>
45 <li>
46 <a href="xslt.html">flat page</a>, <a href="site.xsl">stylesheet</a>
47 </li>
48 </ul></td></tr>
49 </table>
50 <table width="100%" border="0" cellspacing="1" cellpadding="3">
51 <tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>API Indexes</b></center></td></tr>
52 <tr><td bgcolor="#fffacd"><ul>
53 <li><a href="APIchunk0.html">Alphabetic</a></li>
54 <li><a href="APIconstructors.html">Constructors</a></li>
55 <li><a href="APIfunctions.html">Functions/Types</a></li>
56 <li><a href="APIfiles.html">Modules</a></li>
57 <li><a href="APIsymbols.html">Symbols</a></li>
58 </ul></td></tr>
59 </table>
60 <table width="100%" border="0" cellspacing="1" cellpadding="3">
61 <tr><td colspan="1" bgcolor="#eecfa1" align="center"><center><b>Related links</b></center></td></tr>
62 <tr><td bgcolor="#fffacd"><ul>
63 <li><a href="tutorial/libxslttutorial.html">Tutorial</a></li>
64 <li><a href="xsltproc.html">Man page for xsltproc</a></li>
65 <li><a href="http://mail.gnome.org/archives/xslt/">Mail archive</a></li>
66 <li><a href="http://xmlsoft.org/">XML libxml</a></li>
67 <li><a href="http://phd.cs.unibo.it/gdome2/">DOM gdome2</a></li>
68 <li><a href="ftp://xmlsoft.org/">FTP</a></li>
69 <li><a href="http://www.fh-frankfurt.de/~igor/projects/libxml/">Windows binaries</a></li>
70 <li><a href="http://garypennington.net/libxml2/">Solaris binaries</a></li>
71 <li><a href="http://bugzilla.gnome.org/buglist.cgi?product=libxslt">Bug Tracker</a></li>
72 <li><a href="http://xsldbg.sourceforge.net/">Xsldbg Debugger</a></li>
73 </ul></td></tr>
74 </table>
75 </td></tr></table></td>
76 <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">
77 <p>There is a number of language bindings and wrappers available for libxml2,
78 the list below is not exhaustive. Please contact the <a href="http://mail.gnome.org/mailman/listinfo/xml-bindings">xml-bindings@gnome.org</a>
79 (<a href="http://mail.gnome.org/archives/xml-bindings/">archives</a>) in
80 order to get updates to this list or to discuss the specific topic of libxml2
81 or libxslt wrappers or bindings:</p>
82 <ul>
83 <li>
84 <a href="http://mail.gnome.org/archives/xml/2001-March/msg00014.html">Matt
85     Sergeant</a> developped <a href="http://axkit.org/download/">XML::LibXML
86     and XML::LibXSLT</a>, a perl wrapper for libxml2/libxslt as part of the
87     <a href="http://axkit.com/">AxKit XML application server</a>
88 </li>
89 <li>
90 <a href="mailto:dkuhlman@cutter.rexx.com">Dave Kuhlman</a> provides and
91     earlier version of the libxml/libxslt <a href="http://www.rexx.com/~dkuhlman">wrappers for Python</a>
92 </li>
93 <li>Petr Kozelka provides <a href="http://sourceforge.net/projects/libxml2-pas">Pascal units to glue
94     libxml2</a> with Kylix, Delphi and other Pascal compilers</li>
95 <li>Wai-Sun &quot;Squidster&quot; Chia provides <a href="http://www.rubycolor.org/arc/redist/">bindings for Ruby</a>  and
96     libxml2 bindings are also available in Ruby through the <a href="http://libgdome-ruby.berlios.de/">libgdome-ruby</a> module
97     maintained by Tobias Peters.</li>
98 <li>Steve Ball and contributors maintains <a href="http://tclxml.sourceforge.net/">libxml2 and libxslt bindings for
99     Tcl</a>
100 </li>
101 </ul>
102 <p>The libxslt Python module depends on the <a href="http://xmlsoft.org/python.html">libxml2 Python</a> module.</p>
103 <p>The distribution includes a set of Python bindings, which are garanteed to
104 be maintained as part of the library in the future, though the Python
105 interface have not yet reached the maturity of the C API.</p>
106 <p>To install the Python bindings there are 2 options:</p>
107 <ul>
108 <li>If you use an RPM based distribution, simply install the <a href="http://rpmfind.net/linux/rpm2html/search.php?query=libxml2-python">libxml2-python
109     RPM</a> and the <a href="http://rpmfind.net/linux/rpm2html/search.php?query=libxslt-python">libxslt-python
110     RPM</a>.</li>
111 <li>Otherwise use the <a href="ftp://xmlsoft.org/python/">libxml2-python
112     module distribution</a> corresponding to your installed version of
113     libxml2 and libxslt. Note that to install it you will need both libxml2
114     and libxslt installed and run &quot;python setup.py build install&quot; in the
115     module tree.</li>
116 </ul>
117 <p>The distribution includes a set of examples and regression tests for the
118 python bindings in the <code>python/tests</code> directory. Here are some
119 excepts from those tests:</p>
120 <h3>basic.py:</h3>
121 <p>This is a basic test of XSLT interfaces: loading a stylesheet and a
122 document, transforming the document and saving the result.</p>
123 <pre>import libxml2
124 import libxslt
125
126 styledoc = libxml2.parseFile(&quot;test.xsl&quot;)
127 style = libxslt.parseStylesheetDoc(styledoc)
128 doc = libxml2.parseFile(&quot;test.xml&quot;)
129 result = style.applyStylesheet(doc, None)
130 style.saveResultToFilename(&quot;foo&quot;, result, 0)
131 style.freeStylesheet()
132 doc.freeDoc()
133 result.freeDoc()</pre>
134 <p>The Python module is called libxslt, you will also need the libxml2 module
135 for the operations on XML trees. Let's have a look at the objects manipulated
136 in that example and how is the processing done:</p>
137 <ul>
138 <li>
139 <code>styledoc</code> : is a libxml2 document tree. It is obtained by
140     parsing the XML file &quot;test.xsl&quot; containing the stylesheet.</li>
141 <li>
142 <code>style</code> : this is a precompiled stylesheet ready to be used
143     by the following transformations (note the plural form, multiple
144     transformations can resuse the same stylesheet).</li>
145 <li>
146 <code>doc</code> : this is the document to apply the transformation to.
147     In this case it is simply generated by parsing it from a file but any
148     other processing is possible as long as one get a libxml2 Doc. Note that
149     HTML tree are suitable for XSLT processing in libxslt. This is actually
150     how this page is generated !</li>
151 <li>
152 <code>result</code> : this is a document generated by applying the
153     stylesheet to the document. Note that some of the stylesheet informations
154     may be related to the serialization of that document and as in this
155     example a specific saveResultToFilename() method of the stylesheet should
156     be used to save it to a file (in that case to &quot;foo&quot;).</li>
157 </ul>
158 <p>Also note the need to explicitely deallocate documents with freeDoc()
159 except for the stylesheet document which is freed when its compiled form is
160 garbage collected.</p>
161 <h3>extfunc.py:</h3>
162 <p>This one is a far more complex test. It shows how to modify the behaviour
163 of an XSLT transformation by passing parameters and how to extend the XSLT
164 engine with functions defined in python:</p>
165 <pre>import libxml2
166 import libxslt
167 import string
168
169 nodeName = None
170 def f(ctx, str):
171     global nodeName
172
173     #
174     # Small check to verify the context is correcly accessed
175     #
176     try:
177         pctxt = libxslt.xpathParserContext(_obj=ctx)
178         ctxt = pctxt.context()
179         tctxt = ctxt.transformContext()
180         nodeName = tctxt.insertNode().name
181     except:
182         pass
183
184     return string.upper(str)
185
186 libxslt.registerExtModuleFunction(&quot;foo&quot;, &quot;http://example.com/foo&quot;, f)</pre>
187 <p>This code defines and register an extension function. Note that the
188 function can be bound to any name (foo) and how the binding is also
189 associated to a namespace name &quot;http://example.com/foo&quot;. From an XSLT point
190 of view the function just returns an upper case version of the string passed
191 as a parameter. But the first part of the function also read some contextual
192 information from the current XSLT processing environement, in that case it
193 looks for the current insertion node in the resulting output (either the
194 resulting document or the Result Value Tree being generated), and saves it to
195 a global variable for checking that the access actually worked.</p>
196 <p>For more informations on the xpathParserContext and transformContext
197 objects check the <a href="internals.html">libray internals description</a>.
198 The pctxt is actually an object from a class derived from the
199 libxml2.xpathParserContext() with just a couple more properties including the
200 possibility to look up the XSLT transformation context from the XPath
201 context.</p>
202 <pre>styledoc = libxml2.parseDoc(&quot;&quot;&quot;
203 &lt;xsl:stylesheet version='1.0'
204   xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
205   xmlns:foo='http://example.com/foo'
206   xsl:exclude-result-prefixes='foo'&gt;
207
208   &lt;xsl:param name='bar'&gt;failure&lt;/xsl:param&gt;
209   &lt;xsl:template match='/'&gt;
210     &lt;article&gt;&lt;xsl:value-of select='foo:foo($bar)'/&gt;&lt;/article&gt;
211   &lt;/xsl:template&gt;
212 &lt;/xsl:stylesheet&gt;
213 &quot;&quot;&quot;)</pre>
214 <p>Here is a simple example of how to read an XML document from a python
215 string with libxml2. Note how this stylesheet:</p>
216 <ul>
217 <li>Uses a global parameter <code>bar</code>
218 </li>
219 <li>Reference the extension function f</li>
220 <li>how the Namespace name &quot;http://example.com/foo&quot; has to be bound to a
221     prefix</li>
222 <li>how that prefix is excluded from the output</li>
223 <li>how the function is called from the select</li>
224 </ul>
225 <pre>style = libxslt.parseStylesheetDoc(styledoc)
226 doc = libxml2.parseDoc(&quot;&lt;doc/&gt;&quot;)
227 result = style.applyStylesheet(doc, { &quot;bar&quot;: &quot;'success'&quot; })
228 style.freeStylesheet()
229 doc.freeDoc()</pre>
230 <p>that part is identical, to the basic example except that the
231 transformation is passed a dictionnary of parameters. Note that the string
232 passed &quot;success&quot; had to be quoted, otherwise it is interpreted as an XPath
233 query for the childs of root named &quot;success&quot;.</p>
234 <pre>root = result.children
235 if root.name != &quot;article&quot;:
236     print &quot;Unexpected root node name&quot;
237     sys.exit(1)
238 if root.content != &quot;SUCCESS&quot;:
239     print &quot;Unexpected root node content, extension function failed&quot;
240     sys.exit(1)
241 if nodeName != 'article':
242     print &quot;The function callback failed to access its context&quot;
243     sys.exit(1)
244
245 result.freeDoc()</pre>
246 <p>That part just verifies that the transformation worked, that the parameter
247 got properly passed to the engine, that the function f() got called and that
248 it properly accessed the context to find the name of the insertion node.</p>
249 <h3>pyxsltproc.py:</h3>
250 <p>this module is a bit too long to be described there but it is basically a
251 rewrite of the xsltproc command line interface of libxslt in Python. It
252 provides nearly all the functionalities of xsltproc and can be used as a base
253 module to write Python customized XSLT processors. One of the thing to notice
254 are:</p>
255 <pre>libxml2.lineNumbersDefault(1)
256 libxml2.substituteEntitiesDefault(1)</pre>
257 <p>those two calls in the main() function are needed to force the libxml2
258 processor to generate DOM trees compliant with the XPath data model.</p>
259 <p><a href="mailto:daniel@veillard.com">Daniel Veillard</a></p>
260 </td></tr></table></td></tr></table></td></tr></table></td>
261 </tr></table></td></tr></table>
262 </body>
263 </html>