Reputation: 504
How can I get an XML with the following structure:
<Test xmlns="http://default.namespace.com">
<Child xmlns:ovrd="http://overridden.namespace.com">
<ovrd:GrandChild>123</ovrd:GrandChild>
</Child>
</Test>
As I understand WITH NAMESPACES
allows add a namespace only into the root tag.
create table Children (
Id int,
GrandChild varchar(50)
)
GO
insert into Children values (1, '123')
GO
WITH XMLNAMESPACES (
default 'http://default.namespace.com'
)
select GrandChild as 'Child/GrandChild'
from Children
where id = 1
for xml PATH('Test'), ELEMENTS XSINIL
I need to specify a namespace somehow in Child
tag
Upvotes: 0
Views: 150
Reputation: 22177
XQuery to the rescue. It allows to specify multiple namespaces on a different level.
SQL
-- DDL and sample data population, start
DECLARE @mockChildren TABLE (
Id INT,
GrandChild VARCHAR(50)
)
INSERT INTO @mockChildren VALUES (1, '123');
-- DDL and sample data population, end
;WITH XMLNAMESPACES (DEFAULT 'http://default.namespace.com')
SELECT (
SELECT GrandChild AS 'GrandChild'
FROM @mockChildren
WHERE id = 1
FOR XML PATH('row'), TYPE, ROOT('root')
).query('<Test xmlns="http://default.namespace.com">
{
for $r in /root/row
return
<Child xmlns:ovrd="http://overridden.namespace.com">
<ovrd:GrandChild>
{data($r/GrandChild)}
</ovrd:GrandChild>
</Child>
}
</Test>');
XML Output
<Test xmlns="http://default.namespace.com">
<Child xmlns:ovrd="http://overridden.namespace.com">
<ovrd:GrandChild>123</ovrd:GrandChild>
</Child>
</Test>
Upvotes: 2