I'd like to propose the implementation of the XMLNamespaces option for XMLElement.
XMLNAMESPACES(nsuri AS nsprefix) XMLNAMESPACES(DEFAULT default-nsuri) XMLNAMESPACES(NO DEFAULT)
* nsprefix: Namespace's prefix. * nsuri: Namespace's URI. * DEFAULT default-nsuri: Specifies the DEFAULT namespace to use within the scope of a namespace declaration. * NO DEFAULT: Specifies that NO DEFAULT namespace is to be used within the scope of a namespace declaration.
This basically works pretty much like XMLAttributes, but with a few more restrictions (see SQL/XML:2023, 11.2 <XML lexically scoped options>):
* XML namespace declaration shall contain at most one DEFAULT namespace declaration item. * No namespace prefix shall be equivalent to xml or xmlns. * No namespace URI shall be identical to http://www.w3.org/2000/xmlns/ or to http://www.w3.org/XML/1998/namespace. * The value of a namespace URI contained in an regular namespace declaration item (no DEFAULT) shall not be a zero-length string.
Examples:
SELECT xmlelement(NAME "foo", xmlnamespaces('http://x.y' AS bar)); xmlelement ------------------------------- <foo xmlns:bar="http://x.y"/>
In transformXmlExpr() it seemed convenient to use the same parameters to store the prefixes and URIs as in XMLAttributes (arg_names and named_args), but I am still not so sure it is the right approach. Is there perhaps a better way?