ChatGPT解决这个技术问题 Extra ChatGPT

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

我有以下 XML 标记

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

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

欧元

美元

价格翻倍?

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

<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>
如果这样做,您还需要从 元素中删除 type="xs:string" 。当 simpleType 或 complexType 存在时,您不能给出类型。

u
user998692

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

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

正如@kjhughes 所回答的那样,<xs:extension 不能直接是 <xs:complexType 的子级,而是还必须包含在 <xs:complexContent<xs:simpleContent 中。
C
Community

老问题的新答案

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

真正的问题xs:complexType 不能直接将 xs:extension 作为 XSD 中的子级。解决方法是先使用 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 评论的那样,这些确实将价格的内容类型从 xs:string 更改为 xs:decimal,但这并不是绝对必要的,也不是真正的问题。

正如@user998692 所回答的那样,您可以分离出货币的定义,并且可以更改为 xs:decimal,但这也不是真正的问题。

真正的问题xs:complexType 不能直接将 xs:extension 作为 XSD 中的子级;首先需要 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>

A
A.B.Cade

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

<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”属性的限制枚举