也许我已经盯着这个问题太久了,也许没有答案;无论哪种方式我都在这里。
我试图在XSD中允许一组可能的组合,但我似乎无法找到一种不会导致模棱两可的方法。
快速演示代表:
foo+ ( bar baz* | bar? baz+ qux* )
foo
是必需的(一个或多个)bar
存在,baz
是可选的(零或更多)baz
存在,则bar
是可选的(零或一个),qux
是可选的(零或更多< / em>的)qux
不存在,baz
将无法存在 foo bar baz
给出了歧义。
不明确的XSD文档:
<xs:element name="parent">
<xs:complexType>
<xs:sequence>
<xs:element name="foo" minOccurs="1" maxOccurs="unbounded" />
<xs:choice>
<xs:sequence>
<xs:element name="bar" minOccurs="1" maxOccurs="1" />
<xs:element name="baz" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:sequence>
<xs:element name="bar" minOccurs="0" maxOccurs="1" />
<xs:element name="baz" minOccurs="1" maxOccurs="unbounded" />
<xs:element name="qux" minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
有关衡量标准的屏幕截图:
现在,我开始意识到这可能只是XSD内容模型的一个约束。模棱两可的原因很明显;解决方案不是这样。
任何人都可以看到我可以允许的方式;通过重新排序元素,通过使用一些模式设计模式来缓解这样的模糊场景?
bar
和baz
的条件依赖性显然是个问题,但我无法想到其他任何方法。
非常感谢大家。
修改:正在阅读&#34; Schema Component Constraint: Unique Particle Attribution&#34;试图找到一个环洞。任何其他建议阅读欢迎。
答案 0 :(得分:4)
我认为处理这个问题的一个好方法是绘制语法的“铁路图”,即带有过渡的有限状态机。然后,当您在此计算机中发现具有两个标记有相同符号的转换的状态时,您需要构造一个接受这两个转换的新状态,依此类推。在CS文献中,该算法被称为“确定化”。
另一种在没有白板的情况下更容易解释的方法是首先分解出你选择的两个分支之间的共同点。当你点击内容中的第一个元素时,它必须是一个条形或一个baz。所以写两个选择,一个用bar开头,一个用baz开头。
据我所知,您的内容模型与明确的模型相同
(bar, (baz+, qux*)?) | (baz+, qux*)
但我会仔细检查......