2

也许是我盯着这个问题太久了,也许没有答案;不管怎样,我现在在这里。

我试图在 XSD 中允许一组可能的组合,但我似乎无法找到一种不会导致歧义的方法。

快速正则表达式表示:

foo+ ( bar baz* | bar? baz+ qux* )
  • foo是必需的(一个或多个
  • 如果bar存在,baz是可选的(零个或多个
  • 如果baz存在,bar是可选的(零或一)并且qux是可选的(零或更多
  • 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 树


现在,我开始意识到这可能只是 XSD 内容模型的一个约束。模棱两可的原因很明显;解决方案不是这样。

任何人都可以看到我可以允许这样做的方法吗?通过重新排序元素,通过使用一些模式设计模式来缓解这样的模棱两可的场景?

barand的条件依赖性baz显然是问题所在,但我想不出任何其他方法来做到这一点。

非常感谢各位。


编辑:目前正在阅读“ Schema Component Constraint: Unique Particle Attribution ”,试图找到一个漏洞。欢迎任何其他建议阅读。

4

1 回答 1

4

IIRC 计算机科学中有一个定理说每个歧义语法都可以重写为明确的语法,所以从它是可能的假设开始。然而,明确的语法有时可能非常复杂。

我认为处理这个问题的一个好方法是绘制语法的“铁路图”,即有限状态机及其转换。然后,当您在这台机器中发现一个状态具有两个标记为相同符号的转换时,您需要构建一个接受这两个转换的新状态,依此类推。在 CS 文献中,这种算法被称为“确定”。

另一种在没有白板的情况下可能更容易解释的方法是首先考虑您选择的两个分支之间的共同点。当您点击内容中的第一个元素时,它必须是 bar 或 baz。所以写两个选项,一个以 bar 开头,一个以 baz 开头。

据我所知,您的内容模型与明确模型相同

(bar, (baz+, qux*)?) | (baz+, qux*)

但我会仔细检查...

于 2012-05-15T07:59:23.607 回答