我无法弄清楚如何为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)
您的解决方案不是确定性的,因为
<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/>最后为空?,这使得内容模型可选。
| 归档时间: |
|
| 查看次数: |
4070 次 |
| 最近记录: |