DTD или XSD для атрибута XML, где список перечислений содержит значение null

Моя цель/вопрос состоит в том, чтобы понять, как создать DTD или схему для XML, где перечисление значений атрибута может включать значение null в качестве допустимого значения.

Спецификация W3C для XML определяет ограничения допустимости атрибутов, одним из которых является перечисление. Это жестко заданный список допустимых значений атрибутов. Пример:

<foo att="aaa" />

Значение "aaa" должно быть в списке допустимых атрибутов для элемента foo, или атрибут может быть помечен DTD или XSD.

Этот список может быть определен в DTD в!ПРИКРЕПИТЕ список следующим образом:

att ( aaa | bbb ) #IMPLIED

В XSD это выглядит так:

<xs:attribute name="att">
  <xs:simpleType>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="aaa" />
      <xs:enumeration value="bbb" />
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

Теперь, что делать, если допустимо пустое значение? Я не говорю о #ПОДРАЗУМЕВАЕМОМ = необязательном атрибуте. Я говорю об атрибуте, в котором пустое значение так же допустимо, как "aaa" или "bbb". Следующие DTD и XSD недопустимы :

<!ATTLIST att ( | aaa | bbb ) #IMPLIED>

<xs:attribute default="" name="att">
  <xs:simpleType>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="" />
      <xs:enumeration value="aaa" />
      <xs:enumeration value="bbb" />
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

В этих примерах атрибут att является необязательным (#ПОДРАЗУМЕВАЕТСЯ), но если он присутствует, он должен также разрешите пустое значение: att="". XSD делает еще один шаг вперед, чтобы заявить, что если значение отсутствует, то его значению будет присвоено значение null.

Проверка таких атрибутов должна соответствовать этому шаблону (из раздела 3.3.1, пример [59]) :

Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')'

Это регулярное выражение определяет последовательность DTD выше "(aaa|bbb)". После нуля или одного пробела "S?" у нас может быть Nmtoken, необязательно за которым следует другое пространство и канал для большего количества Nmtoken. Значение Nmtoken определено в разделе 2.3 как начинающийся с символа имени. Для null нет никаких ограничений. Символ NameStartChar не может быть кавычкой или пустой строкой.

Но в обычном коде мы можем определить элемент перечисления как пустую строку, и мы можем определить типы, допускающие значение null, включая перечисления. Более конкретно, есть код, в котором мы передаем строку методу, который затем проверяется на соответствие перечислению.

Проблема/приложение, которое я пытаюсь решить, заключается в том, как определить допустимый синтаксис XML в DTD и/или XSD, где код, обрабатывающий XML, может принимать пустую строку. Без этого XML не проверяет att="", даже если он действителен. Нам не все равно? Что ж, для кода, с которым я сейчас работаю, да.

Давайте не будем вдаваться в обоснованность пустых строк в перечислении, используя перечисление.Нет, используя метод (перечисление val), а не метод (строка val) и т. Д. Дело в том, что этот код находится в дикой природе. Он существует в общем FOSS, он работает, и мы не собираемся его переписывать. Проблема заключается в создании XML точно определяет код.

Существует синтаксис XSD для определения альтернативных значений атрибута. Я бы принял шаблон для этого, который работает для этого сценария. В моем непосредственном проекте я создаю DTD (антструктуру задачи Ant) и преобразую ее в XSD. DTD недействителен, поэтому XSD тоже недействителен. Я бы хотел сделать это с DTD, но это не критично.