Пространства имен XML и проверка DTD

Я делаю несколько документов в xml и dtd. Я использую пространство имен xml html для вставки изображения. Но я могу проверить свой документ с помощью xmllint, и я не знаю, почему :/ валидатор останавливается на первой строке. XML-файл:

<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE html:catalog SYSTEM "catalog.dtd">
        <?xml-stylesheet type="text/css" href="style.css" ?>
          <catalog xmlns:html="http://www.w3.org/1999/xhtml">
            <catalogDescription>
              <authors>Autorzy:
                <author age="21">&autor1;</author>
                <author age="21">&autor2;</author>
              </authors>
              <catalogInfo>Katalog zawiera spis gier które posiadamy w sprzedaży w naszym sklepie z grami.</catalogInfo>
            </catalogDescription>
                <games>
    <!-- some data-->
        </games>
              </catalog>

DTD-файл:

<!ELEMENT html:catalog (catalogDescription,games)>
    <!ELEMENT catalogDescription (authors?,catalogInfo?)>
        <!ELEMENT authors (author+)>
            <!ELEMENT author (#PCDATA)>
        <!ELEMENT catalogInfo (#PCDATA)>



    <!ELEMENT games (genres,game+)>
        <!ELEMENT genres (genreType) #REQUIRED>
                <!ATTLIST genreType id ID #REQUIRED>
        <!ELEMENT game (title,more)>
            <!ATTLIST game lang #IMPLIED>
            <!ELEMENT more (screen, description, genre, rank, platforms,cost)>
                <!ATTLIST genre ref  IDREF #REQUIRED>
                <!ELEMENT cost (#PCDATA) >

                <!ELEMENT title (#PCDATA)>
                    <!ELEMENT rank EMPTY>
                    <!ATTLIST rank points CDATA #REQUIRED>
                <!ELEMENT description (#PCDATA)>
                <!ELEMENT platforms (platform+)>
                    <!ELEMENT platform>

                <!ELEMENT screen (thumbnail,bigimage)>
                    <!ELEMENT thumbnaul (html:img)>
                        <!ELEMENT html:img #EMPTY>
                        <!ATTLIST html:img src CDATA>
                    <!ELEMENT bigimage (html:img)>
                <!ELEMENT available (#PCDATA) >

person xmlCoder    schedule 02.11.2010    source источник
comment
В вашем DTD есть некоторые ошибки... Кроме того, это не способ встроить схему XHTML.   -  person    schedule 03.11.2010
comment
В основном я исправил для него DTD. В любом случае это не лучший путь, пространства имен + DTD всегда приводят к проблемам где-то в будущем.   -  person Nic Gibson    schedule 03.11.2010


Ответы (1)


Если вам нужны пространства имен, вы действительно должны использовать схему для начала (либо W3C Schema или RelaxNG). Пространства имен не поддерживаются DTD. Их можно добавить к ним, но на самом деле это хак, и вам нужно проявить большую осторожность, чтобы заставить их работать.

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

<!ELEMENT html:catalog (catalogDescription,games)>    
<!ELEMENT catalogDescription (authors?,catalogInfo?)>    
<!ELEMENT authors (author+)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT catalogInfo (#PCDATA)>
<!ELEMENT games (genres,game+)>

<!-- #REQUIRED is not applicable to elements -->
<!ELEMENT genres (genreType)>
<!ATTLIST genreType id ID #REQUIRED>
<!ELEMENT game (title,more)>

<!-- attributes must have a type -->
<!ATTLIST game lang CDATA #IMPLIED>
<!ELEMENT more (screen, description, genre, rank, platforms,cost)>
<!ATTLIST genre ref  IDREF #REQUIRED>
<!ELEMENT cost (#PCDATA) >

<!ELEMENT title (#PCDATA)>
<!ELEMENT rank EMPTY>
<!ATTLIST rank points CDATA #REQUIRED>
<!ELEMENT description (#PCDATA)>
<!ELEMENT platforms (platform+)>

<!-- this element doesn't make sense - it must have content of some sort, 
    I've made it empty but it's your data! -->
<!ELEMENT platform EMPTY>
<!ELEMENT screen (thumbnail,bigimage)>

<!-- I assume that you meant thumbnail  -->
<!ELEMENT thumbnail (html:img)>

<!-- that's EMPTY not #EMPTY  -->
<!ELEMENT html:img EMPTY>

<!-- the attribute must have the #REQUIRED, #FIXED, etc statement -->
<!ATTLIST html:img src CDATA #REQUIRED>
<!ELEMENT bigimage (html:img)>
<!ELEMENT available (#PCDATA) >

Теперь, поскольку в DTD нет концепции пространства имен, вам необходимо объявить это пространство имен как атрибут. Мы можем добавить это в DTD как атрибут вашего элемента каталога, добавив:

<!ATTLIST catalog xmlns:html CDATA #FIXED "http://www.w3.org/1999/xhtml">

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

<!ELEMENT catalog (catalogDescription,games)>    

Вы не пытаетесь (я надеюсь) добавить свой элемент каталога в XHTML, вы пытаетесь добавить часть XHTML в свой каталог. Итак, ваш XML-документ теперь можно переписать так:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<?xml-stylesheet type="text/css" href="style.css" ?>
<catalog xmlns:html="http://www.w3.org/1999/xhtml">
    <catalogDescription>
        <authors>Autorzy:
            <author age="21">autor1</author>
            <author age="21">autor2</author>
        </authors>
        <catalogInfo>Katalog zawiera spis gier które posiadamy w sprzedaży w naszym sklepie z grami.</catalogInfo>
    </catalogDescription>
    <games>
        <!-- some data-->
    </games>
</catalog>

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

Однако важно понимать, что вы не создали DTD с учетом пространства имен — вы создали DTD, в именах некоторых элементов которого есть двоеточие, что в некоторых отношениях не является недопустимым. Я настоятельно рекомендую вам использовать схему, а не DTD. Вы получите полную информацию о пространстве имен и сможете просто импортировать определения из файла схемы XHTML.

person Nic Gibson    schedule 02.11.2010