我需要创建一个dtd规则,不重复XML元素的值,在这种情况下,我有一个包含5首歌曲(名称,艺术家,专辑,...)的目录,名称元素值可以&# 39;重复一遍,不能有两首同名的歌,我的代码在这里:
XML
<?xml version="1.0"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
<song>
<name>Bed of Roses</name>
<artist>Bon Jovi</artist>
<album>Cross Road</album>
<year>1995</year>
<genre>Ballad</genre>
<coments>Good song</coments>
<path></path>
</song>
<song>
<name>Fly Away from here</name>
<artist>Aerosmith</artist>
<album>Just Push Play</album>
<year>2001</year>
<genre>Rock</genre>
<coments>Good song</coments>
<path></path>
</song>
</catalog>
DTD
<?xml version="1.0"?>
<!ELEMENT catalog (song)>
<!ELEMENT song (name,artist,album,year,genre,comments,path)>
<!ELEMENT song (name)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT artist (#PCDATA)>
<!ELEMENT album (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT genre (#PCDATA)>
<!ELEMENT comments (#PCDATA)>
答案 0 :(得分:2)
您可以做的是使用name
元素上的唯一ID。这只会让你到达一半; ID必须是唯一的,但不会限制name
中的PCDATA。
要解决此问题,请创建文本实体以保存名称元素。您只能引用该实体一次。如果您多次引用它,您将收到类似于以下错误:
ID类型的属性值“song1”在文档中必须是唯一的。
这将确保该名称仅被使用一次。
这是一个例子。 (你也有一些使你的XML / DTD无效的拼写错误。已经修复了。)
<强> catalog.dtd 强>
<!ELEMENT catalog (song+)>
<!ELEMENT song (name,artist,album,year,genre,comments,path)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
id ID #REQUIRED>
<!ELEMENT artist (#PCDATA)>
<!ELEMENT album (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT genre (#PCDATA)>
<!ELEMENT comments (#PCDATA)>
<!ELEMENT path (#PCDATA)>
<!ENTITY song1 '<name id="song1">Bed of Roses</name>'>
<!ENTITY song2 '<name id="song2">Fly Away from here</name>'>
<强> XML 强>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
<song>
&song1;
<artist>Bon Jovi</artist>
<album>Cross Road</album>
<year>1995</year>
<genre>Ballad</genre>
<comments>Good song</comments>
<path></path>
</song>
<song>
&song2;
<artist>Aerosmith</artist>
<album>Just Push Play</album>
<year>2001</year>
<genre>Rock</genre>
<comments>Good song</comments>
<path></path>
</song>
</catalog>
免责声明:我认为这是一个丑陋的黑客。就像mzjn在评论中所说,还有其他技术更适合确保这种类型的约束。