require "test/unit/testcase" require "rexml/document" require "rexml/xpath" require "rexml/parsers/xpathparser" class TestXPathPredicate < Test::Unit::TestCase include REXML SRC=<<-EOL
free flowing text.
free flowing text.
free flowing text.
EOL def setup @doc = REXML::Document.new( SRC ) @parser = REXML::Parsers::XPathParser.new end def test_predicates_parent path = '//section[../self::section[@role="division"]]' m = do_path( path ) assert_equal( 2, m.size ) assert_equal( "2", m[0].attributes["id"] ) assert_nil( m[1].attributes["id"] ) end def test_predicates_single path = '//section[@role="subdivision" and not(../self::section[@role="division"])]' m = do_path( path ) assert_equal( 1, m.size ) assert_equal( "1", m[0].attributes["id"] ) end def test_predicates_multi path = '//section[@role="subdivision"][not(../self::section[@role="division"])]' m = do_path( path ) assert_equal( 1, m.size ) assert_equal( "1", m[0].attributes["id"] ) end def do_path( path ) m = REXML::XPath.match( @doc, path ) #puts path, @parser.parse( path ).inspect return m end def test_get_no_siblings_terminal_nodes source = <<-XML TEXT1 TEXT2 XML doc = REXML::Document.new(source) predicate = "count(child::node()|" + "following-sibling::node()|" + "preceding-sibling::node())=0" m = REXML::XPath.match(doc, "/descendant-or-self::node()[#{predicate}]") assert_equal( [REXML::Text.new("TEXT1"), REXML::Text.new("TEXT2"), REXML::Comment.new("COMMENT")], m ) end end