对同一xsd元素/组的多个引用

时间:2012-12-11 09:57:04

标签: xsd

我必须在多个区域类型之间进行选择,这些区域类型都包含“坐标”。不幸的是,不允许有多个具有相同名称的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”验证程序的错误消息(德语):

  

错误Mehrere Definitionen des Elements'Psid'verursachen ein   mehrdeutiges Inhaltsmodell。 Ein Inhaltsmodell muss so gebildet werden,   dasswährendderValidierung 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,ohne den Inhalt oder die属性   dieses element zu untersuchen und ohne dass beliebige Informationen   zu den Elementen im Rest derSequenzbenötigtwerden。

英文(Google translate

  

错误元素Psid'的几个定义导致含糊不清的内容   模型。必须形成内容模型,以便在验证期间   元素信息序列,直接,间接或   隐式包含试图验证每个元素的粒子   在没有内容的情况下,可以唯一地确定序列中的顺序   或该项目的属性需要调查,没有任何   有关序列其余部分中项目的信息。

1 个答案:

答案 0 :(得分:1)

问题不是对Coordinates组的多次引用 - 问题违反了Unique Particle Attribution rule(在XML规范中描述为deterministic;说明更容易理解)。

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


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

但是,我得到的结论是,您希望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>

BTW:我测试了你的原始XSD和我的xsd解析器(xmllint),它工作正常,解析xml匹配每个选项。它没有标记UPA问题......这很奇怪。尽管有这些证据,但我肯定它确实违反了UPA规则,并且xmllint有错。 有人可以确认或反驳此事吗?

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

EDIT 删除了@SebastianMauthofer在评论中指出的第二层歧义。