我使用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;标签,但在实际数据中,可能会有多个重复,所有信息都包含不同级别的信息,包含在根标记或等效内容中。
非常感谢任何帮助!
谢谢, 标记
答案 0 :(得分:3)
您可以将“empty”的版本定义为不包含任何后代属性或文本节点,而不是不包含任何后代节点。然后通过仅选择其子女的后代来保留<Whatever>
的孩子:
/Whatever/*//*[empty(.//text() | .//attribute())]