元素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。
答案 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。
如果您提供了一个简单的限制,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>
-->
或者,可能更自然地,强制title
或description
元素必须是第一个元素,并且title
和description
元素必须存在或不存在存在的。
<!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)
为什么订单不重要?
在我看来,好像订单在这里有点重要;并且唯一明智的顺序是标题?,描述?,任务*。
灵活性很好,但有时候它并不是必需的。