226
|
1 .. -*- mode: rst; encoding: utf-8 -*-
|
|
2
|
|
3 =====================
|
230
|
4 Using XPath in Genshi
|
226
|
5 =====================
|
|
6
|
230
|
7 Genshi provides basic XPath_ support for matching and querying event streams.
|
226
|
8
|
|
9 .. _xpath: http://www.w3.org/TR/xpath
|
|
10
|
|
11
|
|
12 .. contents:: Contents
|
|
13 :depth: 2
|
|
14 .. sectnum::
|
|
15
|
|
16
|
|
17 -----------
|
|
18 Limitations
|
|
19 -----------
|
|
20
|
230
|
21 Due to the streaming nature of the processing model, Genshi uses only a subset
|
226
|
22 of the `XPath 1.0`_ language.
|
|
23
|
|
24 .. _`XPath 1.0`: http://www.w3.org/TR/xpath
|
|
25
|
|
26 In particular, only the following axes are supported:
|
|
27
|
|
28 * ``attribute``
|
|
29 * ``child``
|
|
30 * ``descendant``
|
|
31 * ``descendant-or-self``
|
|
32 * ``self``
|
|
33
|
230
|
34 This means you can't use the ``parent``, ancestor, or sibling axes in Genshi
|
226
|
35 (the ``namespace`` axis isn't supported either, but what you'd ever need that
|
|
36 for I don't know). Basically, any path expression that would require buffering
|
|
37 of the stream is not supported.
|
|
38
|
394
|
39 Predicates are of course supported, but path expressions *inside* predicates
|
226
|
40 are restricted to attribute lookups (again due to the lack of buffering).
|
|
41
|
|
42 Most of the XPath functions and operators are supported, however they
|
|
43 (currently) only work inside predicates. The following functions are **not**
|
|
44 supported:
|
|
45
|
|
46 * ``count()``
|
|
47 * ``id()``
|
|
48 * ``lang()``
|
|
49 * ``last()``
|
|
50 * ``position()``
|
|
51 * ``string()``
|
|
52 * ``sum()``
|
|
53
|
|
54 The mathematical operators (``+``, ``-``, ``*``, ``div``, and ``mod``) are not
|
|
55 yet supported, whereas the various comparison and logical operators should work
|
|
56 as expected.
|
|
57
|
|
58 You can also use XPath variable references (``$var``) inside predicates.
|
|
59
|
|
60
|
|
61 ----------------
|
|
62 Querying Streams
|
|
63 ----------------
|
|
64
|
|
65 ::
|
|
66
|
230
|
67 from genshi.input import XML
|
226
|
68
|
|
69 doc = XML('''<doc>
|
|
70 <items count="2">
|
|
71 <item status="new">
|
|
72 <summary>Foo</summary>
|
|
73 </item>
|
|
74 <item status="closed">
|
|
75 <summary>Bar</summary>
|
|
76 </item>
|
|
77 </items>
|
|
78 </doc>''')
|
|
79 print doc.select('items/item[@status="closed"]/summary/text()')
|
|
80
|
|
81 This would result in the following output::
|
|
82
|
|
83 Bar
|
|
84
|
|
85
|
|
86 ---------------------
|
|
87 Matching in Templates
|
|
88 ---------------------
|
|
89
|
|
90 See the directive ``py:match`` in the `XML Template Language Specification`_.
|
|
91
|
|
92 .. _`XML Template Language Specification`: xml-templates.html
|