2

元素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。

4

2 回答 2

3

这总结了您需要的内容:

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

title出现之前/之后的交替description

然而,这不是一个确定性的内容模型,正如@13ren 在他的回答中解释的那样。[这是微软的另一个例子]( http://msdn.microsoft.com/en-us/library/9bf3997x(VS.71).aspx)

简而言之

您的要求是有一个非确定性模型,因此,您的场景没有可能的有效DTD。

备择方案

如果您放置一个简单的限制,即如果两者都提供,task或者description必须是最后一个元素task,则description可以使用这个确定性 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>
-->

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

<!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,它允许使用非确定性模型。

于 2010-05-19T06:47:04.287 回答
0

为什么顺序不重要?

在我看来,这里的顺序似乎有点重要;唯一合理的顺序是标题?、描述?、任务*。

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

于 2010-03-03T13:19:55.647 回答