如何从 XQuery 搜索中排除特定节点?

How to exclude specific nodes from XQuery search?

我有以下脚本,它实际上会将 Test="Value" 属性添加到 xml 文档中的所有节点:

declare @xml XML = '
<root>
    <text><b>test2</b></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

但是如何从该查询中排除特定节点?我想将此属性应用于除“a”、“b”之外的所有节点

请尝试以下解决方案。

SQL

DECLARE @xml XML = 
N'<root>
    <text><b>test2</b></text>
    <text>test</text>
    <text>test</text>
    <text>test</text>
</root>;
'
WHILE @xml.exist('//*[not(local-name(.)=("a","b"))][not(@TEST)]') = 1
BEGIN
    SET @xml.modify('
        insert attribute TEST {"value"}
        into (//*[not(local-name(.)=("a","b"))][not(@TEST)])[1]
    ');
END;

-- test
SELECT @xml;

输出

<root TEST="value">
  <text TEST="value">
    <b>test2</b>
  </text>
  <text TEST="value">test</text>
  <text TEST="value">test</text>
  <text TEST="value">test</text>
</root>;