def normalize(val)
case val
when Hash
if( val[TextNode] && val.size == 1 )
val = val[TextNode]
end
when XArray
val = val.reject{|v| v.is_a?(String) && (v =~ /\A\s*\z/) }
if( val.size > 1 )
catch(:break){
h = {}
node_p = false
val.each{|v|
case v
when Hash
v.each{|k,x|
if( h[k] )
throw(:break)
else
h[k] = x
unless( k && (k[0] == ?@) )
node_p = true
end
end
}
else
if( h[TextNode] )
throw(:break)
else
h[TextNode] = v
end
end
}
if( h[TextNode] )
if( h.size == 1 )
h = h[TextNode]
else
if( node_p )
throw(:break)
end
end
end
val.clear
val.push(h)
}
end
when Array
val.reject!{|x|x.nil?}
end
val
end