0

我必须描述在所有包含“坐标”的多个区域类型之间的选择。不幸的是,不允许有多个同名的 xsd 元素——它们是被定义多次还是只是被多次引用都没有关系。

<xs:group name="Region">
    <xs:choice>
        <xs:group ref="tns:CircularRegion" />
        <xs:group ref="tns:RectangularRegion" />
        <xs:group ref="tns:PolygonalRegion" />
    </xs:choice>
</xs:group>

与参考组:

<xs:group name="Coordinates">
    <xs:sequence>
        <xs:element name="Latitude" type="xs:integer" />
        <xs:element name="Longitude" type="xs:integer" />
    </xs:sequence>
</xs:group>
<xs:group name="CircularRegion">
    <xs:sequence>
        <xs:group ref="tns:Coordinates" />
        <xs:element name="Radius" type="xs:integer" />
    </xs:sequence>
</xs:group>
<xs:group name="RectangularRegion">
    <xs:sequence>
        <xs:group ref="tns:Coordinates" />
        <xs:group ref="tns:Coordinates" />
    </xs:sequence>
</xs:group>
<xs:group name="PolygonalRegion">
    <xs:sequence>
        <xs:group minOccurs="3" maxOccurs="12" ref="tns:Coordinates" />
    </xs:sequence>
</xs:group>

由于多次引用“纬度”和“经度”,验证过程以错误结束(多个定义......)。

知道如何解决这个问题吗?

编辑来自“Liquid XML Studio 2012”验证器的错误消息(德语):

Error Mehrere Definitionen des Elements 'Psid' verursachen ein mehrdeutiges Inhaltsmodell。Ein Inhaltsmodel muss so gebildet werden, dass während der Validierung einer Elementinformationssequenz das darin direkt, indirekt oder implizit enthaltene Partikel, mit dem versucht wird, jedes Element in der Sequenz zu validieren, wiederum eindeutig bestimmt werden kann, ohneesden 元素zu untersuchen und ohne dass beliebige Informationen zu den Elementen im Rest der Sequenz benötigt werden。

英文(谷歌翻译

错误 Psid 元素的多个定义导致内容模型模棱两可。必须形成一个内容模型,以便在验证直接、间接或隐含粒子的元素信息序列期间,尝试依次验证序列中的每个元素的粒子可以唯一确定,而无需该项目的内容或属性调查并且没有关于序列其余部分的项目的任何信息。

4

1 回答 1

1

问题不是对Coordinates组的多次引用 - 问题是违反了唯一粒子属性规则(在 XML 规范中被描述为确定性;那里的描述更容易理解)。

这是因为您可以在 和 之间进行选择CircularRegionRectangularRegion但两者都以相同的<Latitude>元素(from Coordinates)开头。如果您想尝试解析其中包含<Latitude>元素的 xml 文档,解析器无法仅通过查看该元素来判断它是来自一个CircularRegion组还是一个组。RectangularRegion(如果它在 xml 中看得更远,它可以,但 UPA 规则不允许这样做)。这是一种特殊的歧义:不止一个粒子(模式的一部分)可以归因于该元素,因此它不是唯一的粒子属性


最明确的解决方案是使用 complexTypes 而不是组,<CircularRegion>将您的每个选择包装在一个唯一元素(例如<RectangularRegion>和)中。<PolygonalRegion>

但是,我得到的印象是您想要 XSD 描述的 XML(或者如果允许的话会描述)。一种简单的方法是排除公共前缀,例如

<xs:group name="Region">
  <xs:sequence>
    <xs:group ref="tns:Coordinates"/>                <!-- common prefix -->
    <xs:choice>
      <xs:element name="Radius" type="xs:integer" /> <!-- Circular      -->
      <xs:group minOccurs="1" maxOccurs="11" ref="tns:Coordinates" />
                                                     <!-- Rect and Poly -->
    </xs:choice>
  </xs:sequence>
</xs:group>

顺便说一句:我测试了您的原始 XSD 和我的 xsd 解析器 (xmllint),它运行良好,解析匹配每个选择的 xml。它没有标记 UPA 问题……这很奇怪。尽管有这些证据,但我肯定它确实违反了 UPA 规则,并且 xmllint 有过错。有人可以确认或反驳吗?

我还测试了我的解决方案,它也有效。

编辑删除了@SebastianMauthofer 在评论中指出的第二级歧义。

于 2012-12-11T13:22:12.373 回答