1
0
mirror of https://github.com/edgewall/genshi.git synced 2026-02-05 15:46:37 +01:00
Files
genshi/doc/xpath.rst
Simon Cross 3b7bf4c23b Migrate documentation to Sphinx. (#89)
* Add basic Sphinx configuration.

* Translate documentation to Sphinx .rst

* Add doc/_build to gitignore.

* Rename requirements.rst back to .txt.

* Fix HTMLFormFiller reference.

* Caption the toctree sections.

* Switch to the RTD Sphinx theme.

* Add API documentation.

* Dowgrade Sphinx to 7.4 for sphinx-rtd-theme.

* Update Read the Docs badge to point to genshi-edgewall.readthedocs.org.
2024-08-27 23:01:49 +02:00

97 lines
2.5 KiB
ReStructuredText

.. -*- mode: rst; encoding: utf-8 -*-
=====================
Using XPath in Genshi
=====================
Genshi provides basic XPath_ support for matching and querying event streams.
.. _xpath: http://www.w3.org/TR/xpath
-----------
Limitations
-----------
Due to the streaming nature of the processing model, Genshi uses only a subset
of the `XPath 1.0`_ language.
.. _`XPath 1.0`: http://www.w3.org/TR/xpath
In particular, only the following axes are supported:
* ``attribute``
* ``child``
* ``descendant``
* ``descendant-or-self``
* ``self``
This means you can't use the ``parent``, ancestor, or sibling axes in Genshi
(the ``namespace`` axis isn't supported either, but what you'd ever need that
for I don't know). Basically, any path expression that would require buffering
of the stream is not supported.
Predicates are of course supported, but path expressions *inside* predicates
are restricted to attribute lookups (again due to the lack of buffering).
Most of the XPath functions and operators are supported, however they
(currently) only work inside predicates. The following functions are **not**
supported:
* ``count()``
* ``id()``
* ``lang()``
* ``last()``
* ``position()``
* ``string()``
* ``sum()``
The mathematical operators (``+``, ``-``, ``*``, ``div``, and ``mod``) are not
yet supported, whereas sub-expressions and the various comparison and logical
operators should work as expected.
You can also use XPath variable references (``$var``) inside predicates.
----------------
Querying Streams
----------------
The ``Stream`` class provides a ``select(path)`` function that can be used to
retrieve subsets of the stream:
.. code-block:: pycon
>>> from genshi.input import XML
>>> doc = XML('''<doc>
... <items count="4">
... <item status="new">
... <summary>Foo</summary>
... </item>
... <item status="closed">
... <summary>Bar</summary>
... </item>
... <item status="closed" resolution="invalid">
... <summary>Baz</summary>
... </item>
... <item status="closed" resolution="fixed">
... <summary>Waz</summary>
... </item>
... </items>
... </doc>''')
>>> print(doc.select('items/item[@status="closed" and '
... '(@resolution="invalid" or not(@resolution))]/summary/text()'))
BarBaz
---------------------
Matching in Templates
---------------------
See the directive ``py:match`` in the `XML Template Language Specification`_.
.. _`XML Template Language Specification`: xml-templates.html