Объявление элемента 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"
,
Если порядок не имеет смысла, вам будет проще указать модель содержимого, если указать произвольную последовательность. (Переменная последовательность необходима, когда она передает информацию; когда она не передает информацию, она только усложняет жизнь и открывает скрытый канал.)