On 26.12.24 14:46, Jim Jones wrote: > The idea of NO DEFAULT is pretty much to free an element (and its > children) from a previous DEFAULT in the same scope. > > SELECT > xmlserialize(DOCUMENT > xmlelement(NAME "root", > xmlnamespaces(DEFAULT 'http:/x.y/ns1'), > xmlelement(NAME "foo", > xmlnamespaces(NO DEFAULT)) > ) AS text INDENT); > > xmlserialize > ------------------------------ > <root xmlns="http:/x.y/ns1">+ > <foo xmlns=""/> + > </root> > (1 row)
v3 is attached, now using xmlTextWriterWriteAttributeNS from libxml2 for managing XML namespaces, instead of using xmlTextWriterWriteAttribute. Libxml2 is quite lenient, allowing the duplication of default namespaces within the same scope and even permitting NO DEFAULT namespaces when no previous DEFAULT declaration has been made - both are semantically valid.
The crux now is finding the appropriate balance between accuracy and user intent. In the context of PostgreSQL's xmlelement and xmlnamespaces, I would argue that explicitly declared namespaces, redundant or not, ought to be preserved. A user who intentionally repeats a namespace declaration might have sound reasons for doing so, like ensuring clarity, preserving compatibility with external XML processors, or sticking to a specific schema. Silently omitting these declarations could lead to confusion.
Now, I have not any objections against the code
The patch has doc and enough regress tests
The patching and compilation without problems
make check-world passed
I'll mark this patch as ready for committer
Pavel has tidied up the parser modifications - it's looking much neater now. Many thanks for that!