Transforming XIST trees

Apart from the convert() method, XIST provides several tools for manipulating an XML tree.

The withsep() method

The method withsep() can be used to put a separator node between the child nodes of an Element or or a Frag:

>>> from ll.xist import xsc
>>> from ll.xist.ns import html
>>> node = html.div(range(10))
>>> print(node.withsep(", ").string())
<div>0, 1, 2, 3, 4, 5, 6, 7, 8, 9</div>

The shuffled() method

The method shuffled() returns a shuffled version of the Element or Frag:

>>> from ll.xist import xsc
>>> from ll.xist.ns import html
>>> node = html.div(range(10))
>>> print(node.shuffled().withsep(", ").string())
<div>8, 1, 3, 6, 7, 5, 2, 9, 4, 0</div>

The reversed() method

The method reversed() returns a reversed version of an element or fragment:

>>> from ll.xist import xsc
>>> from ll.xist.ns import html
>>> node = html.div(range(10))
>>> print(node.reversed().withsep(",").string())
<div>9,8,7,6,5,4,3,2,1,0</div>

The mapped() method

The method 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:

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 mapped() that it should recursively continue with the content of the node.