def Functions::translate( string, tr1, tr2 )
from = string(tr1)
to = string(tr2)
# the map is our translation table.## if a character occurs more than once in the# from string then we ignore the second &# subsequent mappings## if a charactcer maps to nil then we delete it# in the output. This happens if the from# string is longer than the to string## there's nothing about - or ^ being special in# http://www.w3.org/TR/xpath#function-translate# so we don't build ranges or negated classes
map = Hash.new
0.upto(from.length - 1) { |pos|
from_char = from[pos]
unless map.has_key? from_char
map[from_char] =
if pos < to.length
to[pos]
elsenilendend
}
string(string).unpack('U*').collect { |c|
if map.has_key? c then map[c] else c end
}.compact.pack('U*')
end