Updated XPath parser. Fixed fn:number and op:minus. Added fn:document-uri, fn:data...
authorFrederic Jolliton <frederic@jolliton.com>
Mon, 12 Sep 2005 04:57:30 +0000 (04:57 +0000)
committerFrederic Jolliton <frederic@jolliton.com>
Mon, 12 Sep 2005 04:57:30 +0000 (04:57 +0000)
 * Update XPath parser to correctly handle op:plus (+X was same as X,
 instead of ensuring X was cast to a number.) Added fn:plus accordingly.

 * Fixed op:minus to atomize its argument as needed.

 * Fixed fn:number to return a Sequence.

 * Added fn:document-uri and fn:data.
git-archimport-id: frederic@jolliton.com--2005-main/tx--main--0.1--patch-28

xpath.py
xpathfn.py
xpathparser.py

index 892affc..1114ce3 100644 (file)
--- a/xpath.py
+++ b/xpath.py
@@ -67,7 +67,8 @@ axes = {
 }
 
 unaryOperators = {
-         'neg' : opNeg
+         'minus' : opMinus ,
+         'plus'  : opPlus
 }
 
 binaryOperators = {
index 110ebc5..0d739c0 100644 (file)
@@ -340,6 +340,23 @@ def fnString( context , arg = None ) :
                        return _EmptyString
        return Sequence( asString( item ) )
 
+@registerFast( 'fn:data' )
+def fnData( context , arg ) :
+
+       return Sequence( sequenceToData( arg ) )
+
+@registerFast( 'fn:document-uri' )
+def fnDocumentUri( context , node ) :
+
+       node = zeroOrOneNode( node )
+       if node is None :
+               return _Empty
+       else :
+               if isNode( node ) :
+                       return Sequence( node.dmDocumentUri() )
+               else :
+                       return _Empty
+
 # XO/4
 @registerFast( 'fn:trace' )
 def fnTrace( context , value , label ) :
@@ -761,7 +778,7 @@ def fnNumber( context , arg = None ) :
                        raise XPathError( 'FONC0001' , 'Context item undefined' )
        else :
                item = zeroOrOneItem( arg )
-       return asNumber( item )
+       return Sequence( asNumber( item ) )
 
 # XO/14.5
 @registerFast( 'fn:lang' )
@@ -1248,10 +1265,23 @@ def opIntersection( context , arg1 , arg2 ) :
        result.sort( lambda a , b : cmp( a.position , b.position ) )
        return Sequence( result )
 
-@registerFast( 'op:neg' )
-def opNeg( context , arg ) :
+@registerFast( 'op:plus' )
+def opPlus( context , arg ) :
+
+       arg = oneAtomizedItem( arg )
+       if isNumber( arg ) :
+               return Sequence( arg )
+       else :
+               arg = asNumber( arg )
+               if arg is not None :
+                       return Sequence( arg )
+               else :
+                       return _Empty
+
+@registerFast( 'op:minus' )
+def opMinus( context , arg ) :
 
-       arg = oneAtomic( arg )
+       arg = oneAtomizedItem( arg )
        if isNumber( arg ) :
                return Sequence( -arg )
        else :
index 4a05799..b3a259f 100644 (file)
@@ -533,9 +533,12 @@ def xpath() :
        # [20] UnaryExpr
        #
        def xpUnaryExpr( e ) :
-               neg = ( e[ 0 ].count( '-' ) % 2 )
-               if neg :
-                       return ( 'neg' , e[ 1 ] )
+               if e[ 0 ] :
+                       neg = ( e[ 0 ].count( '-' ) % 2 )
+                       if neg :
+                               return ( 'minus' , e[ 1 ] )
+                       else :
+                               return ( 'plus' , e[ 1 ] )
                else :
                        return e[ 1 ]
        unaryExpr = \