diff --git a/feature-xml/babashka/impl/xml.clj b/feature-xml/babashka/impl/xml.clj
index 50127016..f3714a08 100644
--- a/feature-xml/babashka/impl/xml.clj
+++ b/feature-xml/babashka/impl/xml.clj
@@ -1,13 +1,48 @@
(ns babashka.impl.xml
{:no-doc true}
- (:require [clojure.data.xml :as xml]
- [sci.impl.namespaces :refer [copy-var]]
- [sci.impl.vars :as vars]))
+ (:require [babashka.impl.common :refer [ctx]]
+ [clojure.data.xml :as xml]
+ [sci.core :as sci :refer [copy-var]]
+ [sci.impl.vars]))
-(def xns (vars/->SciNamespace 'clojure.data.xml nil))
+(def xns (sci/create-ns 'clojure.data.xml nil))
+
+(defn- clj-ns-name [ns]
+ (cond (instance? sci.impl.vars.SciNamespace ns) (str ns)
+ (keyword? ns) (name ns)
+ :else (str ns)))
+
+(defn alias-uri
+ "Define a Clojure namespace aliases for xmlns uris.
+ This sets up the current namespace for reading qnames denoted with
+ Clojure's ::alias/keywords reader feature.
+
+ ## Example
+ (alias-uri :D \"DAV:\")
+ ; similar in effect to
+ ;; (require '[xmlns.DAV%3A :as D])
+ ; but required namespace is auto-created
+ ; henceforth, shorthand keywords can be used
+ {:tag ::D/propfind}
+ ; ::D/propfind will be expanded to :xmlns.DAV%3A/propfind
+ ; in the current namespace by the reader
+ ## Clojurescript support
+ Currently, namespaces can't be auto-created in Clojurescript.
+ Dummy files for aliased uris have to exist. Have a look at `uri-file` and `print-uri-file-command!` to create those."
+ {:arglists '([& {:as alias-nss}])}
+ [& ans]
+ (loop [[a n & rst :as ans] ans]
+ (when (seq ans)
+ #_(assert (<= (count ans)) (pr-str ans))
+ (let [xn (xml/uri-symbol n)
+ al (symbol (clj-ns-name a))]
+ (sci/eval-form @ctx `(create-ns (quote ~xn)))
+ (sci/eval-form @ctx `(alias (quote ~al) (quote ~xn)))
+ (recur rst)))))
(def xml-namespace
{'aggregate-xmlns (copy-var xml/aggregate-xmlns xns)
+ 'alias-uri (copy-var alias-uri xns)
'as-qname (copy-var xml/as-qname xns)
'cdata (copy-var xml/cdata xns)
'element (copy-var xml/element xns)
diff --git a/test/babashka/main_test.clj b/test/babashka/main_test.clj
index f04563d3..a703b1ee 100644
--- a/test/babashka/main_test.clj
+++ b/test/babashka/main_test.clj
@@ -430,7 +430,9 @@
(deftest clojure-data-xml-test
(is (= "- 1
- 2
"
(bb nil "(let [xml (xml/parse-str \"- 1
- 2
\")] (xml/emit-str xml))")))
- (is (= "0.0.87-SNAPSHOT" (bb nil "examples/pom_version_get.clj" (.getPath (io/file "test-resources" "pom.xml"))))))
+ (is (= "0.0.87-SNAPSHOT" (bb nil "examples/pom_version_get.clj" (.getPath (io/file "test-resources" "pom.xml")))))
+ (is (= ":xmlns.DAV%3A/propfind"
+ (bb nil "(clojure.data.xml/alias-uri :D \"DAV:\") (str ::D/propfind)"))))
(deftest uberscript-test
(let [tmp-file (java.io.File/createTempFile "uberscript" ".clj")]