В соответствии с спецификацией XML это определение пустого элемента:
Элемент без содержимого называется пустым.] Представление пустого элемента является либо начальным тегом, за которым сразу следует конечный тег, либо тег с пустыми элементами.
(см.: http://www.w3.org/TR/REC-xml/#NT-content)
Теперь у меня нет проблем с пониманием тегов с пустыми элементами: <i-am-empty/>
, и недоразумение невозможно. Но мне кажется, что стандарт противоречит самому себе в другом случае: с одной стороны, он говорит, что любой тег без content
пуст, с другой стороны, он говорит, что это может быть представлено начальным тегом, за которым следует сразу конечный тег. Но если мы посмотрим на определение content
:
[43] content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)*
Мне кажется, что content
состоит из двух необязательных частей, CharData?
и группы ()*
. Но поскольку обе эти части являются необязательными, это будет означать, что ничто (как и отсутствие символов) не соответствует этой продукции. SO, если я попытаюсь сопоставить это определение содержимого с тем, что находится внутри <am-i-empty-or-not></am-i-empty-or-not>
, я бы получил положительное совпадение. Итак, с одной стороны, это пустой тег, потому что это "начальный тег, за которым сразу следует конечный тег", с другой стороны, он не пуст, потому что между тегами я могу положительно сопоставлять определение производственного правила [ 43] для содержимого, и в этом случае он содержит контент, что означает, что он не может быть пустым.
Кто-нибудь может объяснить, какие правила имеют приоритет? Кто-нибудь знает о любых реализациях DOM или парсера, которые имеют разные мнения по этому поводу?