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

对同一xsd元素/组的多个引用,xsd,Xsd,我必须在包含“坐标”的多个区域类型之间进行选择。不幸的是,不允许有多个同名的xsd元素——不管它们是被多次定义还是被多次引用 <xs:group name="Region"> <xs:choice> <xs:group ref="tns:CircularRegion" /> <xs:group ref="tns:RectangularRegion" /> <xs:group ref="t

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

元素“Psid”verursachen ein的错误定义 梅尔德乌提格斯在阿尔茨莫代尔。在霍尔茨莫尔,所以格比尔德·沃登, 所有要素信息的有效性和有效性 达林·迪雷克(darin direkt)是麻省理工学院(mit)数字高程模型(dem)的执行者 维苏赫特·维德,维德鲁姆市瓦利迪耶伦区序列中的杰德元素 最重要的是,我们拥有自己的天赋 这是一个非常重要的因素 元素是一个连续的元素

用英语()

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


问题不在于对
坐标
组的多次引用-问题在于违反了(如XML规范中所述;其中的描述更容易理解)

这是因为您可以在
圆形区域
矩形区域
之间进行选择,但两者都以相同的
元素开始(从
坐标
)。 如果您想解析一个包含
元素的xml文档,解析器就无法通过查看该元素来判断它是来自
循环区域
组还是
矩形区域
组。(如果它在xml中看得更远一些,它可能会这样做,但UPA规则不允许这样做)。这是一种特殊的歧义:不止一个粒子(模式的一部分)可以归属于该元素,因此它不是唯一的粒子属性


最清晰的解决方案是使用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>


顺便说一句:我测试了您的原始XSD和我的XSD解析器(xmllint),它工作得很好,解析的xml匹配每个选项。它没有标记UPA问题。。。。这很奇怪。尽管有这些证据,我确信它确实违反了UPA规则,xmllint是错误的有人能证实或反驳这一点吗?

我还测试了我的解决方案,它也可以工作


编辑删除了@SebastianMauthofer在评论中指出的第二层模糊性。

谢谢!:-)我明天去看看!顺便说一句:我是通过“Liquid XML Studio 2012”得到警告的validator@SebastianMauthofer嘿,很酷,但是你得到了什么警告(错误?)?当你有机会的时候,你能把它剪切粘贴到问题上吗?对不起,我只能用德语告诉你一个错误:元素“Psid”verursachen ein mehrdeutiges in Hiltsmodell的错误。在霍尔茨莫代尔的著作中,有效性要素信息是最重要的信息,它体现了对第三方的尊重,是对第三方、第三方、第三方、第三方要素的尊重,属性中的元素是不可更改的,并且是后续的元素信息。我刚刚测试了你的解决方案。为了得到一个有效的结构,还有一件事需要更改:在选项中不能有两个“坐标”组,而是一个基数为1:11的组。然后它就开始工作了!:-)也许在你的解决方案中解决这个问题。我现在就把它标记为已解决。再次感谢您的帮助@SebastianMauthofer愚弄了我,当然你是对的,我的解决方案也违反了UPA;很高兴我给了你足够的解释,让你能够修正我的错误,这很酷。