def _nodesByRelativeLocationTerm(location)
if location !~ /^([a-z]+)\(([^\)]*)\)$/
raise "invalid relative location: '#{location}'"
end
keyword = $1
args = $2.split(/,/)
number = args.shift
ntype = args.shift
ntype = '#element' if ntype.nil?
attributes = args
reverse = false
case number
when nil, ''
raise "missing instance number: '#{location}'"
when 'all'
when Spec::Instance
number = number.to_i
if number < 0
reverse = true
number = -number
end
else
raise "unknown instance number: '#{number}'"
end
if attributes.length % 2 != 0
raise " missing attribute value: '#{location}'"
end
attributes = Hash[*attributes]
i = 0
self.send("_#{keyword}", reverse) do |node|
next unless _matchNode?(node, ntype, attributes)
if number == "all"
yield node
else
i += 1
if i >= number
yield node
break
end
end
end
end