首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >XML模式如何通过枚举限制属性

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

Stack Overflow用户
提问于 2012-01-19 20:02:59
回答 3查看 111.1K关注 0票数 88

我有以下XML标记

代码语言:javascript
复制
<price currency="euros">20000.00</price>

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

  • euros
  • pounds
  • dollars

价格是双倍吗?

我只是得到一个错误,当我尝试在这两个类型,这是我到目前为止:

代码语言:javascript
复制
<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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-19 20:47:31

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

代码语言:javascript
复制
<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>
票数 119
EN

Stack Overflow用户

发布于 2015-10-23 21:07:50

旧问题的新答案

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

真正的问题xs:complexType在XSD中不能直接将xs:extension作为子级。修复方法是首先使用xs:simpleContent。详情如下...

您的XML,

代码语言:javascript
复制
<price currency="euros">20000.00</price>

将对以下任一已更正的XSD有效:

本地定义的属性类型

代码语言:javascript
复制
<?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>

全局定义的属性类型

代码语言:javascript
复制
<?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>

备注

  • As commented by @Paul,它们确实将price的内容类型从xs:string更改为xs:decimal,但这不是严格必要的,也不是真正的问题所在。
  • As answered by @user998692,您可以分离货币的定义,也可以更改为xs:decimal,但这也不是真正的问题。

真正的问题是不能让xs:complexType在XSD中直接拥有一个xs:extension;首先需要的是xs:simpleContent

一个相关的问题(没有被问到,但可能把其他答案搞混了):

既然price 有属性,如何限制它?

在这种情况下,需要对priceType进行单独的全局定义;仅使用局部类型定义是不可能做到这一点的。

元素有属性时如何限制元素内容

代码语言:javascript
复制
<?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>
票数 24
EN

Stack Overflow用户

发布于 2012-01-19 20:16:02

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

代码语言:javascript
复制
<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>

然后:

代码语言:javascript
复制
<xs:complexType>
    <xs:attribute name="currency" type="curr"/>
</xs:complexType>
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8925706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档