元素顺序无关紧要时的DTD

afa*_*f12 2 xml dtd

我无法弄清楚如何为XML文件编写DTD,它可以包含混合顺序的相同元素.

显示问题的小例子如下:

<root>

  <element>
    <one></one>
    <two></two>
  </element>

  <element>
    <two></two>
    <one></one>
  </element>

  <element>
    <two></two>
    <two></two>
    <two></two>
    <two></two>
    <one></one>
    <one></one>
  </element>

</root>
Run Code Online (Sandbox Code Playgroud)

我的DTD:

<!ELEMENT root(element*)>
<!ELEMENT element((one*,two*)|(two*,one*))>
Run Code Online (Sandbox Code Playgroud)

我找到了一个类似的主题,但解决方案在我的情况下不起作用(我不确定我的DTD目前有什么问题).我收到此错误消息:

xmllint: Content model of Instructors is not determinist: ((one* , two*) | (two* , one*))
Run Code Online (Sandbox Code Playgroud)

Dav*_*ton 9

<!ELEMENT element (one|two)*>
Run Code Online (Sandbox Code Playgroud)

(或者+如果你必须至少有一个.)


jas*_*sso 5

您的解决方案不是确定性的,因为

<element>
    <two/>
</element>
Run Code Online (Sandbox Code Playgroud)

是与两个分支都匹配的情况之一:(one*, two*)(two*, one*)

就像 @Cristopher 指出的那样,@Dave 的答案允许混合排序,他的答案解决了这个问题。但实际上克里斯托弗的答案也不是确定性的,因为在验证输入时

<element>
    <two/>
</element>
Run Code Online (Sandbox Code Playgroud)

并且验证器遇到第一个<two>它不知道应该选择哪个分支。它只有在读取所有元素后才知道这一点。<two>

为了在保持模型确定性的同时保持顺序一致,请使用

<!ELEMENT element ( (one+, two*) | (two+, one*) )? >
Run Code Online (Sandbox Code Playgroud)

这里的关键点是:1)通过以不同的强制元素开始每个分支来保持模型的确定性2)但仍然允许<element/>最后为空?,这使得内容模型可选。