1

我正在使用 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

这完全符合我对“GlassesTypes”的要求,但“Flights”中仍有空节点级别。我可以为每个级别重复相同的修改命令,直到只显示“航班”,但这样做会删除“GlassesTypes”空占位符:

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>

在这个例子中,只有“Whatever”标签,但在真实数据中,可能有几个重复的,都具有不同级别的信息,被根标签或等效物所包含。

非常感谢任何帮助!

谢谢,马克

4

1 回答 1

3

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

/Whatever/*//*[empty(.//text() | .//attribute())]
于 2014-09-02T16:28:02.050 回答