必需的标签,可以按随机顺序,只能出现一次

时间:2014-10-26 13:26:40

标签: xml dtd

我想为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呢?

2 个答案:

答案 0 :(得分:0)

不幸的是,表达元素在DTD中的任何顺序都没有好的简写,所以你必须写出titlelink和{的所有组合。 {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答案,对决定论做出了更好的解释:

DTD required elements ordering