XSD 歧义,同一复杂类型中的多个合成器

XSD ambiguities, multiple compositors in the same complex type

XSD 复杂类型,好吧……复杂

先了解一些事实:

正因为如此,我认为这在 xsd/xml (pseudo-xsd):

中是可能的
<someComplexType>
    <sequence minOccurs=0>
      <element A>
      <element B>
    </sequence>
    <sequence>
      <element A>
      <element C>
    </sequence>
</someComplexType>

不确定是否合法,但有可能。

现在,假设 sax/stax 解析器看到元素 A。

接下来会发生什么? 我应该如何确定它是第一个序列中的 A 还是第二个序列中的 A...在检查 next 元素之前?

如果下一个元素是 B,这个 A 可能(!)是第一个序列的匹配项。

如果下一个元素是 C,则同一个 A 可能(!)与第二个序列匹配。

("Probably" 因为上面的整个事情可以是另一个序列的可选嵌套部分,这让我认为这是一个递归问题,它可能发生在任何深度并且做出决定可能必须检查后面的多个元素,在多个深度)

使用类似的 xsd,在解析 xml 时,(我认为)不可能判断当前元素是否属于特定的合成器,直到......稍后,甚至不确定什么时候。

无论如何,这是我的两个问题:

  1. 这样的xsd合法吗?确定性的?遵循唯一粒子属性 (UPA) 规则?或者上帝知道还有什么其他术语?
  2. 如果这是合法的 xsd, sax/stax 解析器如何判断当前元素何时匹配某物,任何东西?不是解析器本身,他不在乎,而是必须解释当前元素的调用者。我想它必须知道下一个元素才能做出正确的决定(选择最佳匹配),这对于 sax/stax 来说是不可能的,仅基于当前的元素。

ps: 试图创建一个 xml 映射工具(不要问为什么)我不知道如何将解析的内容与 xsd 结构匹配,在这种情况下。

非常感谢

任何 XSD 处理者都会告诉您,您的内容模型不被允许,因为它不明确,原因与您描述的完全相同。 (它违反了 UPA 约束)。内容可以(而且必须)从 (AB | AC) 更改为 A (B|C).

当然,也有类似的技术(例如正则表达式处理器或 RelaxNG)允许使用歧义语法:解析它们需要先行或回溯等技术。

如果您打算实现执行此任务的处理器,我建议您阅读一些计算机科学知识。 Aho 和 Ullmann 的 "Dragon book" 是一本标准的教科书 - 非常古老,但仍然非常有用(不记得书名了,我把我的副本留在了办公室)。更具体地说,关于 XSD,可以在爱丁堡大学的 Henry Thompson 网站上找到 Thompson 和 Tobin 的几篇好论文。