编写DTD:如何实现这个子设置

时间:2010-03-03 13:13:10

标签: element dtd children

元素tasklist最多可包含一个title和最多一个description,还可包含任意数量(包括0个)task元素。

天真的做法不适用,因为订单无关紧要:

<!ELEMENT tasklist (title?, description?, task*) >

或者,我可以明确地命名所有可能的选项:

(title, description?, task*) |
(title, task+, description?, task*) |
(task+, title, task*, description?, task*) |
(description, title?, task*) |
(description, task+, title?, task*) |
(task+, description, task*, title?, task*) |
(task*)

但是编写一个非确定性规则很容易,而且它看起来像是最黑暗的疯狂的直接路径。任何想法,如何更优雅地完成这项工作?

不,XSD或RelaxNG是不可取的。我需要一个简单的旧DTD。

2 个答案:

答案 0 :(得分:3)

总结了您的需求:

<!ELEMENT tasklist (task*, ((title?, task*, description?) |
                    (description?, task*, title?)), task*)>

title之前/之后出现的description的替代。

然而,这不是确定性内容模型,如@13ren explains in his answer。 [这是微软的另一个例子](http://msdn.microsoft.com/en-us/library/9bf3997x(VS.71).aspx)

简而言之

您的要求是拥有一个非确定性模型,因此,您的方案中没有可能的有效 DTD。

替代

如果您提供了一个简单的限制,taskdescription必须是最后一个元素,如果同时提供taskdescription,您可以使用此确定性DTD声明:

<!ELEMENT tasklist (
  task*,
  ((title, task*, description?) | 
  (description, task*, title?))?
)>

示例:

<!-- Valid -->
<tasklist>
  <task></task>
  <task></task>
  <task></task>
  <title></title>
  <task></task>
  <description></description>
</tasklist>
<!-- Valid -->
<tasklist>
  <title></title>
  <task></task>
  <task></task>
  <task></task>
</tasklist>
<!-- Invalid
<tasklist>
  <task></task>
  <title></title>
  <task></task>
  <description></description>
  <task></task>
</tasklist>
-->

或者,可能更自然地,强制titledescription元素必须是第一个元素,并且titledescription元素必须存在或不存在存在的。

<!ELEMENT tasklist (
  ((title, task*, description) | 
  (description, task*, title))?,
  task*
)>

示例:

<!-- Valid -->
<tasklist>
  <title></title>
  <task></task>
  <description></description>
  <task></task>
  <task></task>
</tasklist>
<!-- Invalid
<tasklist>
  <task></task>
  <title></title>
  <description></description>
  <task></task>
  <task></task>
</tasklist>

<tasklist>
  <title></title>
  <task></task>
  <task></task>
  <task></task>
</tasklist>
-->

否则

否则,您需要使用RELAX NG,它允许使用非确定性模型。

答案 1 :(得分:0)

为什么订单不重要?

在我看来,好像订单在这里有点重要;并且唯一明智的顺序是标题?,描述?,任务*。

灵活性很好,但有时候它并不是必需的。