Monday, November 08, 2010 at 12:07 AM.
system.verbs.builtins.xml.getNamespaceUriForElement
on getNamespaceUriForElement (adrelement, adrdoc, default="") { <<Changes <<10/3/02; 10:31:14 PM by JES <<Fixed a bug which could cause an erroneous scriptError for elements whose namespace declaration appears on the top-level XML element. <<9/29/02; 6:39:05 PM by JES <<Created. <<Given the address of a compiled XML element, and the address of a compiled XML document, get the namespace URI for the element. <<http://docserver.userland.com/xml/getNamespaceUriForElement local (nsprefix = "", nsattname = ""); if typeOf (adrelement^) == tableType { //look for an nsUri on this element, or set the ns prefix local (adratts = @adrelement^.["/atts"]); if defined (adratts^) { if defined (adratts^.namespace) { //get the namespace prefix if there is one nsprefix = string.popTrailing (adratts^.namespace, ':'); nsattname = "xmlns:" + nsprefix}}}; loop { //pop out 'till we find the namespace declaration, or get to the top of the document if typeOf (adrelement^) == tableType { local (adratts = @adrelement^.["/atts"]); if defined (adratts^) { if nsprefix == "" { //look for a default namespace URI at this level if defined (adratts^.xmlns) { return (adratts^.xmlns)}}; if defined (adratts^.[nsattname]) { //namespace locally declared? return (adratts^.[nsattname])}}}; adrelement = parentOf (adrelement^); if adrelement == parentOf (adrdoc^) { if nsprefix != "" { //this is an error -- the namespace hasn't been declared scriptError ("Can't get the namespace URI for the specified element because there is no namespace declaration for the prefix, \"" + nsprefix + "\".")}; break}}; return (default)} //default namespace <<bundle //test code <<local (adrxstruct = @workspace.snRssXstruct) <<local (adrrss = xml.getAddress (adrxstruct, "rss")) <<local (adrchannel = xml.getAddress (adrrss, "channel")) <<local (adrelement = xml.getAddress (adrchannel, "blogRoll")) <<dialog.notify (getNamespaceUriForElement (adrelement, adrxstruct)) <<bundle //test code 2 <<local (adrxstruct = @workspace.simonTestXstruct) <<local (adrrss = xml.getAddress (adrxstruct, "rss")) <<local (adrchannel = xml.getAddress (adrrss, "channel")) <<local (adritem = xml.getAddress (adrchannel, "item")) <<local (adrelement = xml.getAddress (adritem, "description")) <<dialog.notify (getNamespaceUriForElement (adrelement, adrxstruct)) <<bundle //test code 3 <<local (adrxstruct = @workspace.nsTestXml.xstruct1) <<local (adrxstruct = @workspace.nsTestXml.xstruct2) <<local (adrxstruct = @workspace.nsTestXml.xstruct3) <<local (adrxstruct = @workspace.nsTestXml.xstruct4) <<local (adra = xml.getAddress (adrxstruct, "a")) <<local (adrb = xml.getAddress (adra, "b")) <<local (adrc = xml.getAddress (adrb, "c")) <<local (adrelement = xml.getAddress (adrc, "d")) <<dialog.notify (getNamespaceUriForElement (adra, adrxstruct))
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.