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, но это не критично.