On Wed, May 23, 2012 at 12:02 AM, David Lichteblau david@lichteblau.comwrote:
Quoting Raymond Wiker (rwiker@gmail.com):
Would it be an idea to add functionality similar to what plexippus-xpath provides via with-namespaces? I.e, a special variable that holds the current set of namespace tag/uri mappings, and have some some additional constructors that use split-qname to extract the tag and look-up the url from the current set of mappings.
Possibly... cxml currently has such a macro only for its serialization API, i.e.
CL-USER> (cxml:with-xml-output (stp:make-builder) (cxml:with-namespace ("a" "http://a") (cxml:with-element "a:b" (cxml:text "xyz")))) #.(CXML-STP-IMPL::DOCUMENT :CHILDREN '(#.(CXML-STP:ELEMENT #| :PARENT of type DOCUMENT |# :CHILDREN '(#.(CXML-STP:TEXT #| :PARENT of type ELEMENT |# :DATA "xyz")) :LOCAL-NAME "b" :NAMESPACE-PREFIX "a" :NAMESPACE-URI "http://a")))
That API can't really modify STP in place though; the builder only knows how to set up a full document.
[Subject: changed, as it was getting embarassingly inappropriate.]
I ended up modifying my add-element function, based on the code that you included earlier. It now looks like this:
(defun add-element (parent element-name attributes &optional element-value) (let ((element-name (if (listp element-name) (first element-name) element-name)) (namespace-uri (if (listp element-name) (second element-name) (cxml-stp:find-namespace (cxml::split-qname element-name) parent)))) (let ((new-element (cxml-stp:make-element element-name namespace-uri))) (cxml-stp:append-child parent new-element) (loop for (name value) on attributes by #'cddr do (cxml-stp:add-attribute new-element (cxml-stp:make-attribute (princ-to-string value) name (cxml-stp-impl::find-attribute-namespace (cxml::split-qname name) new-element)))) (when element-value (cxml-stp:append-child new-element (cxml-stp:make-text (princ-to-string element-value)))) new-element)))
This seems to work, but I'm not 100% sure of the code that handles namespaces for attributes.
Note that the code uses two un-exported symbols: cxml::split-name and cxml-stp-impl::find-attribute-namespace. Should these be exported?
Best Regards, Raymond Wiker