docs: def make_axes():
      """Define functions to walk each of the possible XPath axes."""
  
      @axisfn()
      def child(node):
          return node.childNodes
  
      @axisfn()
      def descendant(node):
          for child in node.childNodes:
              for node in descendant_or_self(child):
                  yield node
  
      @axisfn()
      def parent(node):
          if node.parentNode is not None:
              yield node.parentNode
  
      @axisfn(reverse=True)
      def ancestor(node):
          while node.parentNode is not None:
              node = node.parentNode
              yield node
  
      @axisfn()
      def following_sibling(node):
          while node.nextSibling is not None:
              node = node.nextSibling
              yield node
  
      @axisfn(reverse=True)
      def preceding_sibling(node):
          while node.previousSibling is not None:
              node = node.previousSibling
              yield node
  
      @axisfn()
      def following(node):
          while node is not None:
              while node.nextSibling is not None:
                  node = node.nextSibling
                  for n in descendant_or_self(node):
                      yield n
              node = node.parentNode
  
      @axisfn(reverse=True)
      def preceding(node):
          while node is not None:
              while node.previousSibling is not None:
                  node = node.previousSibling
                  # Could be more efficient here.
                  for n in reversed(list(descendant_or_self(node))):
                      yield n
              node = node.parentNode
  
      @axisfn(principal_node_type=xml.dom.Node.ATTRIBUTE_NODE)
      def attribute(node):
          if node.attributes is not None:
              return (node.attributes.item(i)
                      for i in xrange(node.attributes.length))
          return ()
  
      @axisfn()
      def namespace(node):
          raise XPathNotImplementedError("namespace axis is not implemented")
  
      @axisfn()
      def self(node):
          yield node
  
      @axisfn()
      def descendant_or_self(node):
          yield node
          for child in node.childNodes:
              for node in descendant_or_self(child):
                  yield node
  
      @axisfn(reverse=True)
      def ancestor_or_self(node):
          return chain([node], ancestor(node))
  
      # Place each axis function defined here into the 'axes' dict.
      for axis in locals().values():
          axes[axis.__name__] = axis