我正在使用 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”标签,但在真实数据中,可能有几个重复的,都具有不同级别的信息,被根标签或等效物所包含。
非常感谢任何帮助!
谢谢,马克