删除SQL Server中不同级别的空XML标记

时间:2014-09-02 16:05:09

标签: sql sql-server xml xquery xml.modify

我使用FOR XML EXPLICIT进行联合以将一些SQL表信息转换为XML文件。它全部工作,但我在结果中有各种不同级别的空标签。我想删除所有空标记,但保持每个组的顶级。这是我的意思的一个例子:

使用这个无意义的XML示例,我可以使用.modify xquery删除底层空节点:

DECLARE @XML XML = 
'<Whatever>
  <GlassesTypes>
      <GlassesType />
  </GlassesTypes>
  <ExpressionOfJoy>
      <FellOver>Y</FellOver>
  </ExpressionOfJoy>
  <Flights>
    <Flight>
      <Bookings>
        <Booking>
          <Segments>
            <Segment />
          </Segments>
        </Booking>
      </Bookings>
    </Flight>
  </Flights>
</Whatever>'

SELECT @XML as Before

SET  @Xml.modify('delete //*[not(node())]');

SELECT @XML AS After

这完全符合我对“眼镜类型”的要求,但“航班”中仍然存在空节点级别。我可以反复对每个级别重复相同的修改命令,以达到只有&#39; Flights&#39;显示,但这样做会删除&#39; GlassesTypes&#39;空占位符:

DECLARE @XML XML = 
'<Whatever>
  <GlassesTypes>
      <GlassesType />
  </GlassesTypes>
  <ExpressionOfJoy>
      <FellOver>Y</FellOver>
  </ExpressionOfJoy>
  <Flights>
    <Flight>
      <Bookings>
        <Booking>
          <Segments>
            <Segment />
          </Segments>
        </Booking>
      </Bookings>
    </Flight>
  </Flights>
</Whatever>'

SELECT @XML as Before

SET  @Xml.modify('delete //*[not(node())]');
SET  @Xml.modify('delete //*[not(node())]');
SET  @Xml.modify('delete //*[not(node())]');
SET  @Xml.modify('delete //*[not(node())]');
SET  @Xml.modify('delete //*[not(node())]');

SELECT @XML AS After

有没有什么方法可以删除所有空节点,直到倒数第二个空节点,无论一个组包含多少级别?理想的结果是:

<Whatever>
  <GlassesTypes />
  <ExpressionOfJoy>
      <FellOver>Y</FellOver>
  </ExpressionOfJoy>
  <Flights />
</Whatever>

在这个例子中,只有&#39; Whatever&#39;标签,但在实际数据中,可能会有多个重复,所有信息都包含不同级别的信息,包含在根标记或等效内容中。

非常感谢任何帮助!

谢谢, 标记

1 个答案:

答案 0 :(得分:3)

您可以将“empty”的版本定义为不包含任何后代属性或文本节点,而不是不包含任何后代节点。然后通过仅选择其子女的后代来保留<Whatever>的孩子:

/Whatever/*//*[empty(.//text() | .//attribute())]