Объявление элемента DTD ЛЮБЫМИ и обязательными элементами

Я хотел бы описать в DTD элемент MYELEMENT, который должен состоять из elementA, elementB и любого другого элемента. Для этого я попробовал синтаксис:

<!ELEMENT MYELEMENT (elementA | elementB | ANY)*>

Но это не работает, когда возникает элемент, отличный от elementA или elementB. Может кто-нибудь помочь с правильным синтаксисом с DTD?

Можно ли это сделать с помощью схемы XSD?

С уважением

1 ответ

Когда вы говорите "MYELEMENT ... должен [быть] составлен из elementA, elementB и любого другого элемента", вы имеете в виду

  • (A) Возникновение MYELEMENT может иметь ноль или более детей; каждый ребенок может быть назван elementA, elementBили что-нибудь еще.

или же

  • (B) В каждом случае MYELEMENT должен быть указан как минимум один ребенок elementAхотя бы один по имени elementBв любом порядке, и может иметь других детей.

или же

  • (C) В каждом случае MYELEMENT должен быть указан только один ребенок elementAточно один по имени elementBв любом порядке, и может иметь других детей.

Если в DTD ключевое слово ANY были бы своего рода символом подстановки, который соответствовал любому элементу независимо от имени, тогда показанная модель контента соответствовала бы возможности (A). Это не то, что означает ключевое слово, поэтому объявление, которое вы показываете, не делает то, что вы хотите: объявление, которое вы даете, просто означает, что любое вхождение MYELEMENT может содержать ноль или более элементов, если каждый дочерний элемент MYELEMENT назван либо elementA или же elementB или же ANY,

Если (A) это то, что вы хотите, нет необходимости указывать elementA или же elementB совсем; все, что вам нужно, это подстановочный знак, который соответствует любому элементу. У DTD нет такого подстановочного знака, хотя, если вы не возражаете против использования символьных данных, а также дочерних элементов, объявление

<!ELEMENT MYELEMENT ANY >

будет близко к вашей спецификации. В XSD вы бы использовали xsd:any подстановочные.

Если вы хотите (B) или (C), тогда XSD 1.0 может приблизиться; вы можете разрешить элементы, которые вы называете, а также любые элементы в другом пространстве имен, используя подстановочный знак с namespace="##other",

Если порядок не имеет смысла, вам будет проще указать модель содержимого, если указать произвольную последовательность. (Переменная последовательность необходима, когда она передает информацию; когда она не передает информацию, она только усложняет жизнь и открывает скрытый канал.)

Другие вопросы по тегам