我使用XML显式到union将一些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”的要求,但在“航班”中仍然有一些空节点。对于每个级别,我可以一次又一次地重复相同的修改命令,以达到只显示“航班”的程度,但这样做将删除“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>在本例中,只有“任何”标记,但在实际数据中,可能会重复几次,所有这些信息都具有不同级别的信息,包含在根标记或等效信息中。
任何帮助都非常感谢!
谢谢,马克
发布于 2014-09-02 16:28:02
您可以将“空”定义为不包含任何子代属性或文本节点,而不是不包含任何子代节点。然后,仅通过选择其子女的后代来保留<Whatever>的子级:
/Whatever/*//*[empty(.//text() | .//attribute())]https://stackoverflow.com/questions/25627732
复制相似问题