dtd и смешанный контент

Кто-нибудь знает, что для элемента содержимого mixet (в dtd) необходимо добавить "*" в конце?

Например: <!ELEMENT note (#PCDATA|to|from|header|message)*>

Я возвращаюсь к случаю, когда я не хочу ничего повторять ... Я просто хочу иметь возможность выбирать между #PCDATA и другими элементами.

Я знаю, что если я опущу "*" в конце деклерации, я получу плохое отклонение DTD ... Но - я понятия не имею, в чем причина этого ...

Кто-нибудь знает почему?


person amiad21    schedule 13.12.2010    source источник
comment
По какой-то причине в примере, который я написал, не отображается ... Пример: ‹! ELEMENT note (#PCDATA | to | from | header | message) *›   -  person amiad21    schedule 14.12.2010


Ответы (2)


Вы попадаете в это ограничение, потому что модель смешанного содержимого может ограничивать только то, какие элементы встречаются, а не их порядок или количество. Боюсь, что этого требует сама спецификация XML. .

Боюсь, смешанное содержание сложно. Модель была разработана с учетом документов - это имеет смысл, когда вы думаете о встроенном тексте, но не во многих других случаях. Если у вас есть выбор, то лучше всего будет предложить вам создать элемент, содержащий ваши PCDATA. Если вы не можете, то я боюсь, что вы застряли в рамках моделей смешанного контента (я боюсь, что использование другого языка схем тоже не очень помогает).

person Nic Gibson    schedule 14.12.2010
comment
Привет, прежде всего - спасибо! Я знаю, что это спецификация ... Я пытаюсь выяснить, в чем дело? Какая проблема будет в том случае, если * не нужен? - person amiad21; 14.12.2010
comment
Ах :) Хорошее начало. В SGML существует проблема, которая называется «вредоносное смешанное содержимое». Если вы погуглите, то найдете хорошие описания. XML был разработан таким образом, что не могло возникнуть вредоносное смешанное содержимое. Это ограничение модели смешанного содержимого гарантирует, что этого не произойдет. - person Nic Gibson; 15.12.2010

Вы хотите использовать ЛЮБОЙ

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE things [
    <!ELEMENT things ANY>
]>
<things>
    <person name="a" />
    <cats />
    <dogs />
    <animals><a rel="gogo" /></animals>
</things>

Кроме того, * - это оператор от нуля до большего количества вхождений. Итак, (element|element2)* говорит либо, либо / и

person John Giotta    schedule 13.12.2010