Объявление типа документа и пространства имен


Я новичок в XML и в настоящее время изучаю декларацию типов документов. В любом случае, при объявлении элементов в теле DTD имя элемента должно отображаться точно так же, как и в документе XML, включая любой префикс пространства имен, что означает, что пользователи не могут определять свое собственное пространство имен, но должны использовать префикс, определенный в DTD.

а) Я предполагаю, что хотя мы должны использовать префиксы, определенные в DTD, мы все равно можем выбирать, на какие URI указывают эти префиксы?


б) Предполагая, что мы объявляем (в DTD) элемент, где pers - это префикс пространства имен, означает ли это, что все вхождения этого элемента в XML-документе должны включать префикс "pers"? Если это так, то это означает, что с DTD мы не можем использовать функцию пространства имен по умолчанию?!


Thanx


РЕДАКТИРОВАТЬ:


а)

На самом деле, если нет особенно веской причины или у вас есть простые синтаксические требования и нет необходимости в пространствах имен, вам следует рассмотреть возможность использования схем XML.

Вместо этого я планирую использовать XML-схему, но я также хотел бы изучить основы DTD.


б)

… Здесь нет понятия URI пространства имен (ни пространства имен по умолчанию).

Если мы объявим атрибут с именем "xmlns" в DTD:

<!ATTLIST contact xmlns CDATA #REQUIRED> 


тогда XML-документ может использовать функцию пространства имен по умолчанию (здесь дочерний элемент <name> находится в пространстве имен по умолчанию):

       ...
<contact xmlns=”www.somewhere.com” … > 
   <name></name>
</contact>       
       ...


Thanx

2 ответа

DTD не имеют никакого представления о пространствах имен вообще. Концепция пространства имен была введена после их зачатия.

Для пространств имен XML важной частью является URI пространства имен, а не префикс; Префикс может быть свободно изменен пользователем.

С другой стороны, когда заданные "префиксы" пространства имен в DTD, часть префикса просто считается частью имени элемента (поскольку DTD не имеет концепции пространства имен). Поэтому "префикс" НЕ МОЖЕТ быть изменен, и в нем нет понятия URI пространства имен (ни пространства имен по умолчанию).

На самом деле, если нет особенно веской причины или у вас есть простые синтаксические требования и нет необходимости в пространствах имен, вам следует рассмотреть возможность использования схем XML.

Полная спецификация схемы может быть пугающей, но я обнаружил, что каждый изучает определенное адекватное подмножество, которое не так сложно. У ребят в W3Schools есть хороший учебник по основам.

имя элемента должно отображаться точно так же, как и в документе XML, включая любой префикс пространства имен, что означает, что пользователи не могут определять свое собственное пространство имен, но должны использовать префикс, определенный в DTD.

Это правильно. Это возможно благодаря широкому использованию объектов параметров в DTD, что позволяет произвольно конфигурировать префиксы для каждой части составного типа документа:

<!ENTITY % mydoc.prefix "mydoc:">
...
<!ENTITY % mydoc.element.qname "%mydoc.prefix;element">
<!ENTITY % mydoc.foo.qname "%mydoc.prefix;foo">
<!ENTITY % mydoc.bar.qname "%mydoc.prefix;bar">
<!ELEMENT %mydoc.element.qname; (%mydoc.foo.qname; | %mydoc.bar.qname;)>

Посмотрите работу по модульности XHTML и тип документа "DTD XHTML 1.1 плюс MathML 2.0 плюс SVG 1.1" для некоторых примеров того, как это может работать. (Ответ "не очень хорошо".)

Означает ли это, что все вхождения этого элемента в XML-документе должны включать префикс "pers"?

Да, если только вы не подтолкнете DTD для повторного определения одних и тех же элементов для другого префикса (или без префикса). Хотя вы могли бы сделать это (и вы могли бы даже сделать так, чтобы элементы с одним префиксом имели модель содержимого, включающую элементы с другим префиксом), было бы чрезвычайно болезненно писать с использованием нескольких уровней сущностей параметров, и ваш DTD мог бы закончиться нечитаемым.

+1 к совету Cumbayah: если у вас есть какой-либо выбор в этом вопросе (и особенно если вы делаете что-либо с использованием пространств имен), не используйте старый скрипучий DTD. Любая из альтернатив (W3 Schema, RELAX NG, Schematron...) будет лучше подходить для этой задачи сегодня.

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