Thanks Noam! That works. Would be good to explain that in the help output. I think this ticket can be closed now.
xmlstarlet val: Consistent message order
Workaround I'm using (inside a Dockerfile): mkdir -p /io cat > /io/input.xml xmlstarlet validate --xsd "$1" --err /io/input.xml
Allow val to read from stdin