模式中的内容模型歧义

时间:2012-05-15 05:30:54

标签: xml xsd ambiguity

也许我已经盯着这个问题太久了,也许没有答案;无论哪种方式我都在这里。

我试图在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>

有关衡量标准的屏幕截图:

Ambiguous XSD tree


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

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

barbaz的条件依赖性显然是个问题,但我无法想到其他任何方法。

非常感谢大家。


修改:正在阅读&#34; Schema Component Constraint: Unique Particle Attribution&#34;试图找到一个环洞。任何其他建议阅读欢迎。

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

但我会仔细检查......