Added two iterators (iterChildOrTop and iterAttributeOrTop) for XSLT support.
authorFrederic Jolliton <frederic@jolliton.com>
Tue, 13 Sep 2005 05:57:27 +0000 (05:57 +0000)
committerFrederic Jolliton <frederic@jolliton.com>
Tue, 13 Sep 2005 05:57:27 +0000 (05:57 +0000)
git-archimport-id: frederic@jolliton.com--2005-main/tx--main--0.1--patch-34

iterators.py

index 6d0c3c0..205b87e 100644 (file)
@@ -40,6 +40,9 @@ __all__ = [
        'iterPrecedingSibling' ,
        'iterPreceding' ,
        'iterAncestorOrSelf' ,
+       # XSLT Pattern axis
+       'iterChildOrTop' ,
+       'iterAttributeOrTop' ,
        # TX Extension
        'iterDescendantOrSelfFull' ,
        'iterChildReversed' ,
@@ -73,6 +76,21 @@ def iterChild( node ) :
                for child in node.children :
                        yield child
 
+# [xslt20] "If the context node is a parentless element, comment,
+# processing-instruction, or text node then the child-or-top axis
+# selects the context node; otherwise it selects the children of the
+# context node. It is a forwards axis whose principal node kind is
+# element."
+
+def iterChildOrTop( node ) :
+
+       if node.parent is None \
+                   and isinstance( node , ( Element , Comment , ProcessingInstruction , Text ) ) :
+               yield node
+       elif isinstance( node , ( Document , Element ) ) :
+               for child in node.children :
+                       yield child
+
 # [xpath20] "the descendant axis is defined as the transitive closure
 # of the child axis; it contains the descendants of the context node
 # (the children, the children of the children, and so on)"
@@ -109,6 +127,19 @@ def iterAttribute( node ) :
                for attribute in node.attributes :
                        yield attribute
 
+# [xslt20] "If the context node is an attribute node with no parent,
+# then the attribute-or-top axis selects the context node; otherwise
+# it selects the attributes of the context node. It is a forwards axis
+# whose principal node kind is attribute."
+
+def iterAttributeOrTop( node ) :
+
+       if node.parent is None and isinstance( node , Attribute ) :
+               yield node
+       elif isinstance( node , Element ) :
+               for attribute in node.attributes :
+                       yield attribute
+
 # [xpath20] "the self axis contains just the context node itself"
 
 def iterSelf( node ) :