# -*- ruby -*- # This is a test script for xpath. # Note that this is not W3C XPath! require 'xtemplate' $data = { 'members' => { 'man' => [ {'@uid' => 1, 'name' => 'name1', 'age' => 20}, {'@uid' => 2, 'name' => 'name2', 'age' => 21}, {'@uid' => 3, 'name' => 'name3', 'age' => 22}, ], 'woman' => [ {'@uid' => 4, 'name' => 'name4', 'age' => 20}, {'@uid' => 5, 'name' => 'name5', 'age' => 21}, {'@uid' => 6, 'name' => 'name6', 'age' => 22}, ] }, 'others' => [ {'@uid' => 10, 'name' => 'name10'}, {'@uid' => 11, 'name' => 'name11'}, ] } def xpath(path) XTemplate::XPath::xpath(path,$data) end def test(path, val) if( xpath(path) == val ) print("#{path}: ok\n") else print("#{path}: fail\n") end end test("/members/man", $data['members']['man']) test("/members/woman|/members/man", $data['members']['woman'] + $data['members']['man']) test("/members/man[0,2]", $data['members']['man'][0,2]) test("/members/man[0,2]/name", $data['members']['man'][0,2].collect{|x| x['name']}) test("/members/man[0..1]/name", $data['members']['man'][0..1].collect{|x| x['name']}) test("/members/man/@uid", $data['members']['man'].collect{|x| x['@uid']}) test("/members/*/@uid", xpath("/members/man/@uid") + xpath("/members/woman/@uid")) test("/**/@uid", xpath("/*/@uid") + xpath("/*/*/@uid")) # age is an integer value in given data. we don't need to convert it. test("/**/man[int(age)>20]", xpath("/**/man").select{|n| n.is_a?(Hash) && n['age']>20}) test("/**[age and age>20]", xpath("/**").select{|n| n.is_a?(Hash) && n['age'] && n['age']>20}) test("/**[name =~ /1/]", xpath("/**").select{|n| n.is_a?(Hash) && n['name'] =~ /1/ }) test("/**[name = 'name10']", xpath("/**").select{|n| n.is_a?(Hash) && n['name'] == 'name10' }) test("/members/./man/.", xpath("/members/man")) test("/members/man[0]/../woman/name", xpath("/members/woman/name"))