xsd - 对complexType而不是元素的唯一约束

标签 xsd

我具有以下XSD结构:

<xs:schema xmlns:ns="http://abc/">
  ...
  <xs:element name="abc">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="map"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  ...
  <xs:element name="map">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="entry" type="ns:MapEntryType" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="entry">
      <xs:selector xpath="entry"/>
      <xs:field xpath="key"/>
    </xs:unique>
  </xs:element>
  <xs:complexType name="MapEntryType">
    <xs:sequence>
      <xs:element name="key" type="xs:string"/>
      <xs:element name="value" type="xs:anyType"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

这是在做它的工作。

现在必须根据包装器中的任何一个将map元素称为不同的名称,因此名称有时为map,有时为properties,有时为options等。

因此,我想泛化map元素。

我尝试执行以下操作:
  • map设置为xs:complexType并将ref更改为type
  • 这导致xs:unique不被接受,并且
  • 失败
  • map设置为xs:complexType,将ref更改为type,并将xs:unique约束移至元素定义。
  • 可行,但导致XSD在文档中存在很多xs:unique

  • 难道没有一种方法可以简单地告诉我我想要一个特定的结构并且它包含唯一的元素,而不必到处重复唯一的约束吗?

    最佳答案

    简短的回答,这是不可能的。 XSD 1.0和1.1都将身份约束放在一个元素下。一个约束不能被全局定义,因此除了封闭元素之外,本身没有“重用”。给定您的方案(针对不同需求的不同元素名称),就无法重用。

    关于xsd - 对complexType而不是元素的唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32826828/

    相关文章:

    c# - 将 XML 反序列化为 XSD 生成的类时出现问题

    java - JAXB 和继承

    java - 从/src/main/resources加载文件

    java - JaxB 重命名具有重复名称的类

    java - 将 JAXB 对象存储到多个 XML 文件中

    java - 生成实现接口(interface)的 JAXB 类

    xml - 使用 xsd 将 csv 转换为 xml

    xml - 在 XSD 中扩展复杂类型的示例?

    xsd - 如何对xsd :dateTime?施加分钟限制

    java - XJC 不生成带有命名空间的@XmlElement 吗?