Transforming XIST trees
=======================
Apart from the :meth:`~ll.xist.xsc.Node.convert` method, XIST provides several
tools for manipulating an XML tree.
The :meth:`withsep` method
--------------------------
The method :meth:`~ll.xist.xscFrag.withsep` can be used to put a separator node
between the child nodes of an :class:`~ll.xist.xsc.Element` or
or a :class:`~ll.xist.xsc.Frag`:
.. sourcecode:: pycon
>>> from ll.xist import xsc
>>> from ll.xist.ns import html
>>> node = html.div(range(10))
>>> print(node.withsep(", ").string())
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
The :meth:`shuffled` method
---------------------------
The method :meth:`~ll.xist.xsc.Frag.shuffled` returns a shuffled version of the
:class:`~ll.xist.xsc.Element` or :class:`~ll.xist.xsc.Frag`:
.. sourcecode:: pycon
>>> from ll.xist import xsc
>>> from ll.xist.ns import html
>>> node = html.div(range(10))
>>> print(node.shuffled().withsep(", ").string())
8, 1, 3, 6, 7, 5, 2, 9, 4, 0
The :meth:`reversed` method
---------------------------
The method :meth:`~ll.xist.xsc.Frag.reversed` returns a reversed version of an
element or fragment:
.. sourcecode:: pycon
>>> from ll.xist import xsc
>>> from ll.xist.ns import html
>>> node = html.div(range(10))
>>> print(node.reversed().withsep(",").string())
9,8,7,6,5,4,3,2,1,0
The :meth:`mapped` method
-------------------------
The method :meth:`~ll.xist.xsc.Node.mapped` recursively walks the tree and
generates a new tree, where all the nodes are mapped through a function.
An example: To replace ``Python`` with ``Parrot`` in every text node on the
`Python home page`_, do the following:
.. sourcecode:: python
from ll.xist import xsc, parse
def p2p(node, converter):
if isinstance(node, xsc.Text):
node = node.replace("Python", "Parrot")
node = node.replace("python", "parrot")
return node
node = parse.tree(
parse.URL("http://www.python.org"),
parse.Tidy(),
parse.NS(html),
parse.Node(pool=xsc.Pool(xml, html)),
)
node = node.mapped(p2p)
node.write(open("parrot_index.html", "wb"))
The function must either return a new node, in which case this new node will
be used instead of the old one, or return the old node to tell
:meth:`~ll.xist.xsc.Node.mapped` that it should recursively continue with the
content of the node.
.. _Python home page: http://www.python.org/