我想为XML文件定义DTD,如下所示:
item
代码包含title
代码,link
代码和description
代码;这些标签是必需的,必须只出现一次,但它们可以按任何顺序排列。 author
代码和pubDate
代码是可选的。
在我的DTD中,我写道如下:
<!ELEMENT item (title | link | description | author? | pubDate?)*>
但这意味着title
代码,link
代码和description
代码可以多次出现。
如果我写了以下内容:
<!ELEMENT item (title | link | description | author? | pubDate?)>
我不得不在title
代码,link
代码和description
代码之间进行选择。
如果我写如下:
<!ELEMENT item (title, link, description, author?, pubDate?)>
我必须尊重订单。
那我怎么写DTD呢?
答案 0 :(得分:0)
不幸的是,表达元素在DTD中的任何顺序都没有好的简写,所以你必须写出title
,link
和{的所有组合。 {1}}并将它们组合在由description
分隔的子序列(序列中的序列)中,其功能为:
|
如果您希望<!ELEMENT item ( (
(title,link,description)|
(link,description,title)|
(description,title,link)|
(title,description,link)|
(description,link,title)|
(link,title,description) ), author?, pubDate?)>
和author
也出现在任何地方,您将需要创建五个标记的所有可能组合(!)。
答案 1 :(得分:0)
i-alarmed-alien是正确的,您需要指定可能的内容模型的所有组合,但给出的示例不是deterministic。这意味着如果不展望未来,XML处理器无法知道匹配哪个模型。
这是一个确定性的例子:
<!ELEMENT item ((
(title, ((link,description)|(description,link)))|
(link, ((title,description)|(description,title)))|
(description, ((link,title)|(title,link)))
),author?,pubdate?)>
这是另一个SO答案,对决定论做出了更好的解释: