根据其他节点的属性值删除节点

时间:2018-05-07 15:06:34

标签: sql-server xml xpath xquery xml-dml

我在SQL中返回了以下XML,我想使用SQL XML DML根据不同节点的值有条件地删除节点。在我的例子中,当“Size”节点的“Value”属性的值等于“S”时,我想删除“Color”节点。

<root>
            <ParentGroup>
                            <ChildGroup Id="1">
                                            <Child Id="1">
                                                            <Color Value="Red"/>
                                                            <Size Value="L"/>
                                            </Child>
                                            <Child Id="2">
                                                            <Color Value="Blue"/>
                                                            <Size Value="S"/>
                                            </Child>
                            </ChildGroup>
                            <ChildGroup Id="2">
                                            <Child Id="5">
                                                            <Color Value="Blue"/>
                                                            <Size Value="L"/>
                                            </Child>
                                            <Child Id="9">
                                                            <Color Value="Red"/>
                                                            <Size Value="S"/>
                                            </Child>
                            </ChildGroup>
            </ParentGroup>
</root>

我希望得到的XML是:

<root>
            <ParentGroup>
                            <ChildGroup Id="1">
                                            <Child Id="1">
                                                            <Color Value="Red"/>
                                                            <Size Value="L"/>
                                            </Child>
                                            <Child Id="2">
                                                            <Size Value="S"/>
                                            </Child>
                            </ChildGroup>
                            <ChildGroup Id="2">
                                            <Child Id="5">
                                                            <Color Value="Blue"/>
                                                            <Size Value="L"/>
                                            </Child>
                                            <Child Id="9">
                                                            <Size Value="S"/>
                                            </Child>
                            </ChildGroup>
            </ParentGroup>
</root>

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以使用predicate<Child> - 节点缩减为列表,这样可以满足您的条件:

DECLARE @xml XML=
N'<root>
  <ParentGroup>
    <ChildGroup Id="1">
      <Child Id="1">
        <Color Value="Red" />
        <Size Value="L" />
      </Child>
      <Child Id="2">
        <Color Value="Blue" />
        <Size Value="S" />
      </Child>
    </ChildGroup>
    <ChildGroup Id="2">
      <Child Id="5">
        <Color Value="Blue" />
        <Size Value="L" />
      </Child>
      <Child Id="9">
        <Color Value="Red" />
        <Size Value="S" />
      </Child>
    </ChildGroup>
  </ParentGroup>
</root>';

- 查询将搜索<Child>,其中Value中的属性<Size>为&#34; S&#34;并删除他们的<Color>

SET @xml.modify('delete /root/ParentGroup/ChildGroup/Child[Size/@Value="S"]/Color');

SELECT @xml;

如果你需要介绍&#34; S&#34;作为变量,您可以使用sql:variable()

DECLARE @SearchFor VARCHAR(10)='S';
SET @xml.modify('delete /root/ParentGroup/ChildGroup/Child[Size/@Value=sql:variable("@SearchFor")]/Color');