【问题标题】:Restricting element in xsdxsd 中的限制元素
【发布时间】:2015-08-24 18:38:17
【问题描述】:

我需要限制 PersonalDetailsType 中的 Age 元素,使其仅接受整数值。 不应在 canonical.xsd 中进行更改。所有的修改都必须在 Extn.xsd 中进行

我尝试了很多方法,但无法设置限制。所以,想到这里。在底部你可以找到应该遵守Extn.xsd的所需XML。

提前谢谢..

canonical.xsd

      <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema attributeFormDefault="unqualified" 
    elementFormDefault="qualified" 
    targetNamespace="http://www.example.org/cononical" 
    xmlns:con="http://www.example.org/cononical"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

      <xs:element name="Employees">
        <xs:complexType>
          <xs:sequence>
          <xs:element ref="NameDeatils"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>

<xs:element name="NameDeatils" type="con:PersonalDetailsType"/>       

<xs:complexType name ="PersonalDetailsType" >
                <xs:sequence >
                  <xs:element type="xs:string" name="Name"/>
                  <xs:element ref="con:Age"/>
                </xs:sequence>
       </xs:complexType>



       <xs:element name="Age" type="con:AgeType"></xs:element>

       <xs:simpleType name="AgeType">
       <xs:restriction base="con:BaseType">
       </xs:restriction>
       </xs:simpleType>

        <xs:simpleType name="BaseType">
       <xs:restriction base="xs:string">
       </xs:restriction>
       </xs:simpleType>

    </xs:schema>

Extn.xsd

    <xs:schema attributeFormDefault="unqualified" 
targetNamespace="http://www.example.org/cononicalExtn"
xmlns:conExtn="http://www.example.org/cononicalExtn"
xmlns:con="http://www.example.org/cononical"
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:import namespace="http://www.example.org/cononical"  schemaLocation ="canonical.xsd"/>

  <xs:element name="EmployeeDetails">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="AddressDetails">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:short" name="Flat"/>
              <xs:element type="xs:string" name="Place"/>
              <xs:element ref ="conExtn:PersonalInfo"/> 
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>


   <xs:complexType name="PersonalInfoType">
    <xs:sequence>
          <xs:element ref ="con: NameDeatils” />
    </xs:sequence>
    </xs:complexType>


  <xs:element name="PersonalInfo" type="conExtn:PersonalInfoType" /> 

</xs:schema>

必需的 XML

<EmployeeDetails>
    <AddressDetails>
        <Flat>123</Flat>
        <Place>India</Place>
        <PersonalInfo>
    <NameDeatils>
            <Name>Ram</Name>
            <Age>12</Age>
    </NameDeatils>
        </PersonalInfo>
    </AddressDetails>
</EmployeeDetails>

【问题讨论】:

  • 您是否&lt;Age&gt;定义为派生自con:AgeType?你不能把它定义为xs:positiveInteger吗?
  • 我不打算更改 canonical.xsd
  • 那么您的问题令人困惑,因为您定义了一个新的PersonalInfoType 类型,与canonical.xsd 中定义的PersonalDetailsType 类型不同。因此,您可以随意定义它。

标签: java xml soap xsd


【解决方案1】:

您不能将 Age 类型重新定义为与 canonical 不同的类型(请参阅 XSD: How to redefine the data type of a simpleType eg. from xs:string to xs:integer

您可以使用 xs:redefine 将 AgeType 限制为“更像整数”(即没有字母字符,最小长度 = 1 等),但这是您可以做到的。

如果 Age 元素被定义为更通用的类型,例如 xs:string,那么您根本无法重新定义,因为 xs:redefine 仅适用于类型,而不适用于元素(参见 Is it possible to redefine something defined as xsd:element?

使用 Override 可能会带来更好的运气:

Difference between xs:redefine and xs:override in XML schema 1.1

【讨论】:

    猜你喜欢
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2013-10-10
    • 1970-01-01
    • 2015-07-11
    相关资源
    最近更新 更多