Вы не указали диалект SQL ([sql]
недостаточно, всегда указывайте СУБД, включая версию).
Это для SQL-сервера, но семантика должна быть одинаковой.
DECLARE @xml XML=
N'<root>
<SelfClosing />
<NoContent></NoContent>
<BlankContent> </BlankContent>
<HasContent>blah</HasContent>
<HasContent>other</HasContent>
</root>';
SELECT @xml.query(N'/root/*') AS AnyBelowRoor --All elements
,@xml.query(N'/root/*[text()]') AS AnyWithTextNode --blah and other
,@xml.query(N'/root/*[not(text())]') AS NoText --no text
,@xml.query(N'/root/*[text()="blah"]') AS AnyWithTextNode--blah only
<SelfClosing />
семантически совпадает с <NoContent><NoContent>
. Нет никакой разницы.
Это может быть сюрпризом, но blank
, поскольку контент тоже считается пустым.
Таким образом, проверка на пусто или не пусто - это проверка на существование узла text()
. можно отрицать это с помощью not()
, чтобы найти все без text()
.
Интересно: результат для NoText
возвращается так (SQL-Server)
<SelfClosing />
<NoContent />
<BlankContent />
Три элемента неявно возвращаются в кратчайшем формате.