Объявление типа документа и пространства имен - PullRequest
1 голос
/ 19 января 2010


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

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


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


* 1016 спасибо *


EDIT:


а)

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

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


б)

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

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

<!ATTLIST contact xmlns CDATA #REQUIRED> 


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

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


1056 * спасибо *

Ответы [ 2 ]

4 голосов
/ 19 января 2010

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

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

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

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

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

3 голосов
/ 19 января 2010

имя элемента должно отображаться точно так же, как и в документе 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, RELAX NG, Schematron ...) будет лучше подходить для этой задачи сегодня.

...