Как использовать одно и то же имя элемента для разных целей (в XML и DTD)?

Я хочу создать схему DTD для этого XML-документа:

<root>

    <student>
        <name>
            <firstname>S1</firstname>
            <lastname>S2</lastname>
        </name>
    </student>

    <course>
        <name>CS101</name>
    </course>

</root>

as you can see , the element name in the course contains plain text ,but the element name in the student is complex type ( first-name, last-name ). The following is the DTD:

<!ELEMENT root (course|student)*>

<!ELEMENT student (name)>
<!ELEMENT name (lastname|firstname)>
<!ELEMENT firstname (#PCDATA)>
<!ELEMENT lastname (#PCDATA)>

<!ELEMENT course (name)>

Когда я хочу проверить его, я получаю сообщение об ошибке, потому что name курса имеет другую структуру, чем name учащегося.

Мой вопрос:

  • как я могу найти обходное решение для этой ситуации, не меняя имя элемента name, используя DTD, а не схему xml.

Спасибо.


person Abdullah    schedule 30.05.2010    source источник


Ответы (1)


Извиняюсь! Это одно из основных ограничений DTD: заданное имя элемента всегда имеет одну и ту же модель содержимого.

Все, что вы можете сделать, это отказаться от полной проверки для этого конкретного элемента и разрешить все возможное содержимое:

<!ELEMENT name (#PCDATA|lastname|firstname)*>
person bobince    schedule 30.05.2010
comment
Спасибо @bobince, я буду использовать то, что вы написали, как обходной путь, это проще, чем XML-схема. - person Abdullah; 30.05.2010
comment
При использовании PCDATA это лучшее, что вы можете сделать, но если все три возможности являются элементами, вы можете получить несколько лучшие результаты. Рассмотрим элемент <p>. Элемент <p> может содержать либо элемент <a>, либо элементы <b> и <c>. Мы можем указать это, просто это не будет зависеть от контекста (т.е. зависит от родителя <p>). <!ELEMENT p (a | (b, c))>. PCDATA должен использоваться как смешанный контент или отдельно; это не может быть ситуация или/или, к сожалению. - person Sandy Gifford; 18.04.2013