[cxml-devel] Exported symbols [was: Re: Possible bug in cxml-stp]
Raymond Wiker
rwiker at gmail.com
Fri May 25 10:28:59 UTC 2012
On Wed, May 23, 2012 at 12:02 AM, David Lichteblau <david at lichteblau.com>wrote:
> Quoting Raymond Wiker (rwiker at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cxml-devel/attachments/20120525/fde6d98a/attachment.html>
More information about the cxml-devel
mailing list