这总结了您需要的内容:
<!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 title
ordescription
元素必须是第一个元素,并且title
anddescription
元素必须存在或不存在。
<!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,它允许使用非确定性模型。