XML模式如何通过枚举限制属性


85

我有以下XML标签

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

如何将currency属性限制为以下一项:

  • 欧元
  • 美元

和价格翻番?

当我尝试同时输入两者时,我只是得到一个错误,这是到目前为止我得到的:

<xs:element name="price">
    <xs:complexType>
        <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:complexType>
</xs:element>

1
如果执行此操作,则还需要从<xs:attribute>元素中删除type =“ xs:string”。存在simpleType或complexType时,不能提供类型。
2015年

Answers:


116

您的价格定义中似乎缺少该数值。请尝试以下操作:

<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>

3
正如@kjhughes回答的那样,<xs:extension不能直接是的子代,<xs:complexType而必须也包含在<xs:complexContent或中<xs:simpleContent
HankCa

22

旧问题的新答案

这个老问题的现有答案都无法解决真正的问题。

真正的问题是在XSD中xs:complexType不能直接拥有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>

笔记

  • @Paul评论,这些确实将内容类型price从更改 xs:stringxs:decimal,但这不是严格必需的,也不是真正的问题。
  • @ user998692回答的那样,您可以分离货币的定义,也可以更改为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>

8

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

<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>

您好,很遗憾,这不允许我同时将Price类型限制为“ double”和对“ currency”属性的限制枚举
Luke

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

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


@value不能出现在上xs:attributexs:attribute不能作为的子代出现xs:elementxs:省略所需的名称空间前缀。 这个答案是一团糟,应该将其删除。
kjhughes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.