The resolve-uri() function on .NET does not accept URIs containing spaces. This is not actually a bug; it's correct according to the specification, even though the implementation on Java does accept spaces. The correct action is to call iri-to-uri() to escape special characters before calling resolve-uri(). However (and this IS a bug) using iri-to-uri() in this way causes resolve-uri() to fail, saying the URI is invalid - the error message actually reports the unescaped version of the URI. This problem arises because Saxon calls the .NET method System.Uri.ToString() to convert the Uri to a string prior to converting it back to a Java java.net.URI(), and the ToString() method loses the escaping.
A simple fix to this would be replace the call on System.Uri.ToString() with a call on System.Uri.AbsoluteUri, which does not unescape the URI. However, it appears to be possible to adopt a more radical solution, which is to use the same code for URI resolution in the .NET product as is used on the Java platform. The original reason for separating them was apparently because of bugs in the GNU classpath library which have long since been fixed. Adopting this change makes URIs with spaces work on .NET in the same way as on Java, eliminating the need to call iri-to-uri(). This solution is being applied in Subversion and will appear (real soon now) in Saxon 9.1.0.7
Fixed in 9.1.0.7