@buffym but in mapping false, it's throwing all the errors away and always returning true.

This code would behave as expected:

<pre>
if soft
  @schema.validate(@xml).empty?
else
  @schema.validate(@xml).each{ |error| validation_error("#{error.message}\n\n#{@xml.to_s}") }.empty?
end
</pre>

But yes, it's an odd pattern.