Thanks to Jeremy, I have a patch that works on Java 1.4 and have attached a revised version of sdo.patch.
In addition to the changes in spec.patch and sdo.patch, these files needed to be changed
so that a Java 1.4 JRE could load and run the code (I tested with IBM's 142 JVM):
Added private static methods to replace Node.isEqualNode(Node) method.
Commented out use of Node.isEqualNode(Node) and added use of replacement method.
Changed Document.normalizeDocument() to Document.normalize() twice.
Commented out use of Document.getXmlVersion().
Changed StringBuilder to StringBuffer.
Changed IllegalArgumentException(e) to IllegalArgumentException(e.getMessage()).
Changed from V1_5 to V1_4 in visitType method.
Added private static canonicalize method based on javadoc of Class.getName() and
execution comparison with Class.getCanonicalName().
Changed property.getType().getInstanceClass().getCanonicalName() to
Incidentally, I also discovered the reason I had problems applying sdo.patch: apparently "svn diff" preserves whatever line ending characters it finds in the patch file it generates. The version of the "patch" command that I have (from cygwin) strips any CR characters it finds in a patch when the patched file lacks them but it refuses to add a CR character to match a line when the patch file lacks CR but the patched file has a CR and refuses to apply the patch at that location.