我在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) >
答案 0 :(得分:3)
如果您需要名称空间,真的应该使用架构作为开始(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">
完成后我们需要删除几个前缀。首先,不需要在catalog元素上有前缀,这样就可以从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模式文件中导入定义。