Re-enable spec/library for full CI runs.
[rbx.git] / lib / rexml / xpath.rb
blob939399e2834daaa66975fda66cbab312746b558d
1 require 'rexml/functions'
2 require 'rexml/xpath_parser'
4 module REXML
5         # Wrapper class.  Use this class to access the XPath functions.
6         class XPath
7                 include Functions
8                 EMPTY_HASH = {}
10                 # Finds and returns the first node that matches the supplied xpath.
11                 # element::
12                 #       The context element
13                 # path::
14                 #       The xpath to search for.  If not supplied or nil, returns the first
15                 #       node matching '*'.
16                 # namespaces::
17                 #       If supplied, a Hash which defines a namespace mapping.
18                 #
19                 #  XPath.first( node )
20                 #  XPath.first( doc, "//b"} )
21                 #  XPath.first( node, "a/x:b", { "x"=>"http://doofus" } )
22     def XPath::first element, path=nil, namespaces=nil, variables={}
23       raise "The namespaces argument, if supplied, must be a hash object." unless namespaces.nil? or namespaces.kind_of?(Hash)
24       raise "The variables argument, if supplied, must be a hash object." unless variables.kind_of?(Hash)
25                         parser = XPathParser.new
26                         parser.namespaces = namespaces
27                         parser.variables = variables
28                         path = "*" unless path
29                         element = [element] unless element.kind_of? Array
30                         parser.parse(path, element).flatten[0]
31                 end
33                 # Itterates over nodes that match the given path, calling the supplied
34                 # block with the match.
35                 # element::
36                 #   The context element
37                 # path::
38                 #   The xpath to search for.  If not supplied or nil, defaults to '*'
39                 # namespaces::
40                 #       If supplied, a Hash which defines a namespace mapping
41                 #
42                 #  XPath.each( node ) { |el| ... }
43                 #  XPath.each( node, '/*[@attr='v']' ) { |el| ... }
44                 #  XPath.each( node, 'ancestor::x' ) { |el| ... }
45                 def XPath::each element, path=nil, namespaces=nil, variables={}, &block
46       raise "The namespaces argument, if supplied, must be a hash object." unless namespaces.nil? or namespaces.kind_of?(Hash)
47       raise "The variables argument, if supplied, must be a hash object." unless variables.kind_of?(Hash)
48                         parser = XPathParser.new
49                         parser.namespaces = namespaces
50                         parser.variables = variables
51                         path = "*" unless path
52                         element = [element] unless element.kind_of? Array
53                         parser.parse(path, element).each( &block )
54                 end
56                 # Returns an array of nodes matching a given XPath.  
57                 def XPath::match element, path=nil, namespaces=nil, variables={}
58                         parser = XPathParser.new
59                         parser.namespaces = namespaces
60                         parser.variables = variables
61                         path = "*" unless path
62                         element = [element] unless element.kind_of? Array
63                         parser.parse(path,element)
64                 end
65         end
66 end