Пространства имен XML и проверка DTD - PullRequest
2 голосов
/ 02 ноября 2010

Я делаю некоторые документы в xml и dtd.Я использую в пространстве имен XML HTML, чтобы вставить изображение.Но я могу проверить свой документ с помощью xmllint, и я не знаю, почему: / validator останавливается на первой строке.Файл 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) >

1 Ответ

3 голосов
/ 03 ноября 2010

Если вам нужны пространства имен, вы действительно должны использовать схему для начала (либо 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.

...