XML中相同元素的XSD定义

时间:2015-06-04 15:46:23

标签: xml xsd

我正在尝试为具有这些内容的XML提供XSD复杂类型

<SimpleData name="omsId">46</SimpleData>
<SimpleData name="registrationNumber">206-TG-4</SimpleData> 
<SimpleData name="obstacleType">Antenna</SimpleData>  
<SimpleData name="signature">OEI</SimpleData>
<SimpleData name="state">A</SimpleData>
<SimpleData name="maxHeightAGL">75</SimpleData>
<SimpleData name="topElevationAMSL">787</SimpleData> 

在上面的示例中,元素是相同的,每个元素都具有相同的名称属性标记,具有不同的值。

请建议。

由于

1 个答案:

答案 0 :(得分:1)

您想要一个具有任何名称属性的复杂类型吗? 如果是这样,他的怎么样:

  <element name="SimpleData">
    <complexType>
      <simpleContent>
        <extension base="string">
          <attribute name="name" type="string" use="required"/>
        </extension>
      </simpleContent>
    </complexType>
  </element>

或者您希望名称仅限于您上面使用的名称吗?如果是这种情况,请尝试以下版本:

  <element name="SimpleData">
    <complexType>
      <simpleContent>
        <extension base="string">
          <attribute name="name" type="MyDatatypes" use="required"/>
        </extension>
      </simpleContent>
    </complexType>
  </element>
  <simpleType name="MyDatatypes">
    <restriction base="string">
      <enumeration value="omsId"/>
      <enumeration value="registrationNumber"/>
      <enumeration value="obstacleType"/>
      <enumeration value="signature"/>
      <enumeration value="state"/>
      <enumeration value="maxHeightAGL"/>
      <enumeration value="topElevationAMSL"/>
    </restriction>
  </simpleType>

我还不清楚你的问题是否要对每个元素的使用次数有任何限制?是否应该按照您给出的顺序或上述样本中的每一个使用它们?

添加了一个基于反馈的新示例,这次限制了属性,使每个属性都恰好存在。

你需要对SimpleData的父元素进行测试,我把它称为root,但你可以使用你想要的任何东西。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="SimpleData"/>
      </xs:sequence>
      <xs:assert test="count(SimpleData) = 7"/>
    </xs:complexType>
    <xs:unique name="UniqueSimpleData">
      <xs:selector xpath="SimpleData" /> 
      <xs:field xpath="@name" /> 
    </xs:unique>
  </xs:element>
  <xs:element name="SimpleData">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="name" type="MyDatatypes" use="required"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:simpleType name="MyDatatypes">
    <xs:restriction base="xs:string">
      <xs:enumeration value="omsId"/>
      <xs:enumeration value="registrationNumber"/>
      <xs:enumeration value="obstacleType"/>
      <xs:enumeration value="signature"/>
      <xs:enumeration value="state"/>
      <xs:enumeration value="maxHeightAGL"/>
      <xs:enumeration value="topElevationAMSL"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

有两件事是新的。 首先是断言(这仅适用于XSD 1.1! - 请确保您的软件支持1.1版,否则您将收到错误消息。 断言检查您是否存在7个SimpleData元素(每个属性一个)。 第二个新事物是唯一约束,这确保每个元素属性组合仅使用一个。

只有唯一的检查,您将不允许双重输入但是可以省略列表中的一个,并且只有6个存在,所以您确实需要这两个检查。

希望这能解决你的问题。