    # File temp/xpath_parser.rb, line 85
        def first( path_stack, node )
          #puts "#{depth}) Entering match( #{path.inspect}, #{tree.inspect} )"
          return nil if path.size == 0

          case path[0]
          when :document
            # do nothing
            return first( path[1..-1], node )
          when :child
            for c in node.children
              #puts "#{depth}) CHILD checking #{name(c)}"
              r = first( path[1..-1], c )
              #puts "#{depth}) RETURNING #{r.inspect}" if r
              return r if r
            end
          when :qname
            name = path[2]
            #puts "#{depth}) QNAME #{name(tree)} == #{name} (path => #{path.size})"
            if node.name == name
              #puts "#{depth}) RETURNING #{tree.inspect}" if path.size == 3
              return node if path.size == 3
              return first( path[3..-1], node )
            else
              return nil
            end
          when :descendant_or_self
            r = first( path[1..-1], node )
            return r if r
            for c in node.children
              r = first( path, c )
              return r if r
            end
          when :node
            return first( path[1..-1], node )
          when :any
            return first( path[1..-1], node )
          end
          return nil
        end