XML Schema如何通过枚举限制属性

时间:2012-01-19 12:02:59

标签: xml xsd

我有以下XML标记

<price currency="euros">20000.00</price>

如何将货币属性限制为以下之一:

  • 欧元

和价格变成双倍?

当我尝试在两者上打字时,我只是得到一个错误,这是我到目前为止所得到的:

<xs:element name="price">
    <xs:complexType>
        <xs:attribute name="currency" type="xs:string">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="pounds" />
                    <xs:enumeration value="euros" />
                    <xs:enumeration value="dollars" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:element>

4 个答案:

答案 0 :(得分:110)

您的价格定义似乎缺少数值。 请尝试以下方法:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>



<xs:element name="price">
        <xs:complexType>
            <xs:extension base="xs:decimal">
              <xs:attribute name="currency" type="curr"/>
            </xs:extension>
        </xs:complexType>
</xs:element>

答案 1 :(得分:20)

旧问题的新答案

这个旧问题的现有答案都没有解决真正的问题。

真正的问题 xs:complexType在XSD中不能直接拥有xs:extension作为孩子。修复方法是先使用xs:simpleContent。细节如下......

您的XML,

<price currency="euros">20000.00</price>

对以下更正的XSD的 有效:

本地定义的属性类型

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

全球定义的属性类型

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="currencyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="pounds" />
      <xs:enumeration value="euros" />
      <xs:enumeration value="dollars" />
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency" type="currencyType"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

备注

  • 作为commented by @Paul,这些确实会改变内容类型 从pricexs:string的{​​{1}},但这并不严格 必要而且不是真正的问题。
  • 作为answered by @user998692,您可以将其分开 货币的定义,您可以更改为xs:decimal,但是 这也不是真正的问题。

真正的问题xs:decimal在XSD中不能直接拥有xs:complexType作为孩子;首先需要xs:extension

相关事项(没有被问过,但可能混淆了其他答案):

如果xs:simpleContent具有属性,price如何受到限制?

在这种情况下,需要对priceType进行单独的全球定义;只能使用本地类型定义来执行此操作。

如何在元素具有属性

时限制元素内容
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="priceType">  
    <xs:restriction base="xs:decimal">  
      <xs:minInclusive value="0.00"/>  
      <xs:maxInclusive value="99999.99"/>  
    </xs:restriction>  
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="priceType">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

答案 2 :(得分:7)

您需要创建一个类型并创建该类型的属性:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>

然后:

<xs:complexType>
    <xs:attribute name="currency" type="curr"/>
</xs:complexType>

答案 3 :(得分:-2)

<xs:element name="price" type="decimal">
<xs:attribute name="currency" type="xs:string" value="(euros|pounds|dollars)" /> 
</element> 

这将完全消除对枚举的需要。 如果需要,您可以将类型更改为double。