如何将 xml 属性添加到 xml 文档的所有节点?

How to add xml attribute to all nodes of xml document?

我有一个名为 XmlDocument 的数据库 table 带有 XML 字段,用于存储xml。这是存储 xml:

的示例
<ol type="decimal" id="id-a4bb3b6d-9908-4972-8b02-72e286795b7a">
    <item id="id-92332716-4561-4874-d353-39fdf993fa89">
        <para id="id-a3fae837-59d8-4702-b689-f869137a92a7">Item1</para>
    </item>
    <item id="id-d8031e83-5b68-47cb-f535-41bee9682f4a">
        <para id="id-8746fe56-3160-4543-bf28-5f1e1de83ec0">Item2</para>
    </item>
</ol>

我的目标是编写一个 tsql 脚本,它将 revNumber 属性添加到没有此属性的文档的所有节点。它应该是这样的:

<ol revNumber="1.1" type="decimal" id="id-a4bb3b6d-9908-4972-8b02-72e286795b7a">
    <item revNumber="1.2" id="id-92332716-4561-4874-d353-39fdf993fa89">
        <para revNumber="1.3" id="id-a3fae837-59d8-4702-b689-f869137a92a7">Item1</para>
    </item>
    <item revNumber="1.0" id="id-d8031e83-5b68-47cb-f535-41bee9682f4a">
        <para revNumber="1.2" id="id-8746fe56-3160-4543-bf28-5f1e1de83ec0">Item2</para>
    </item>
</ol>

如果节点已经有这个属性,我们应该跳过它。我们可以使用类似的东西,但它只适用于一个节点:

SET @requestXML.modify(
'insert 
(        
    attribute revNumber {sql:variable("@revNum") }
)
into (/ol)[1]')

但文档的结构可能不同。最好的方法是什么?

终于找到了解决办法:

declare @xml XML = '
<root>
    <text>test</text>
    <text>test</text>
    <text>test</text>
    <text>test</text>
</root>
'
while @xml.exist('//*[not(@TEST)]') = 1
begin
    set @xml.modify('
        insert attribute TEST {"value"}
        into (//*[not(@TEST)])[1]
    ')
end
select @xml