         case .datatype("http://www.w3.org/2001/XMLSchema#string"):
             let escaped = value.replacingOccurrences(of:"\"", with: "\\\"")
             return "\"\(escaped)\""
-        case .datatype("http://www.w3.org/2001/XMLSchema#integer"), .datatype("http://www.w3.org/2001/XMLSchema#float"), .datatype("http://www.w3.org/2001/XMLSchema#decimal"), .datatype("http://www.w3.org/2001/XMLSchema#boolean"):
+        case .datatype("http://www.w3.org/2001/XMLSchema#float"):
+            let s = "\(value)"
+            if s.contains("e") {
+                return s
+            } else {
+                return "\(s)e0"
+            }
+        case .datatype("http://www.w3.org/2001/XMLSchema#integer"), .datatype("http://www.w3.org/2001/XMLSchema#decimal"), .datatype("http://www.w3.org/2001/XMLSchema#boolean"):
             return "\(value)"
         case .datatype(let dt):
             let escaped = value.replacingOccurrences(of:"\"", with: "\\\"")

        switch type {
        case .datatype("http://www.w3.org/2001/XMLSchema#integer"):
            return Double(value) ?? 0.0
        case .datatype("http://www.w3.org/2001/XMLSchema#float"), .datatype("http://www.w3.org/2001/XMLSchema#decimal"):
            return Double(value) ?? 0.0
        default:
            fatalError()

extension Term : Comparable {
    var isNumeric : Bool {
        switch type {
        case .datatype("http://www.w3.org/2001/XMLSchema#integer"),
             .datatype("http://www.w3.org/2001/XMLSchema#decimal"),
             .datatype("http://www.w3.org/2001/XMLSchema#float"),
             .datatype("http://www.w3.org/2001/XMLSchema#double"):
            return true
        default:
            return false
