8

我有这样的xsd类型

<xsd:simpleType name="carsEnum">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="Seat"/>
        <xsd:enumeration value="Opel"/>
    </xsd:restriction>
</xsd:simpleType>

现在我可以这样使用它了——<xsd:attribute name="carModel" type="carsEnum"/>

如何重建 carEnum 以使用任何其他字符串?

举个例子 -

< ... carModel="Seat"/>
< ... carModel="Some string"/>
< ... carModel="Opel"/>

当然,我可以像往常一样创建类型 carsEnum 的字符串,但是在 IDE Idea 中使用这种结构相当舒服,因为它显示了工具提示。

4

2 回答 2

10

如果我总结您的问题,我的理解是您想要维护一个元素汽车的可能值列表,还想要接受出现在该有界列表之外的任何值。这可以在 XSD 中使用UNION. 我用下面的例子来说明它。

示例 XML:

<?xml version="1.0" encoding="utf-8"?>
<cars>ssd</cars>

XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="cars" type="carsType"/>
  <xs:simpleType name="carsType">
    <xs:union memberTypes="carsEnum carsAnyString"/>
  </xs:simpleType>
  <xs:simpleType name="carsEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Seat"/>
      <xs:enumeration value="Opel"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="carsAnyString">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
</xs:schema>

在上面的 XSD 中,我使用了 CAR 的多个定义,一次作为枚举列表,一次作为任何字符串。定义结合这两者的 UNION 类型将type用于汽车。

所以<cars可以有如下值:Seat、Opel、anyOtherCar、AnyString2 ..

我还想提一种控制ANY STRING. 以上 XSD 可以接受任何字符串,即使是特殊字符和数字。我们可以通过restriction pattern仅添加 Alpha 字符来限制这一点。下面是 XSD 代码:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="cars" type="carsType"/>
  <xs:simpleType name="carsType">
    <xs:union memberTypes="carsEnum carsAnyAlphaString"/>
  </xs:simpleType>
  <xs:simpleType name="carsEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Seat"/>
      <xs:enumeration value="Opel"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="carsAnyAlphaString">
    <xs:restriction base="xs:string">
      <xs:pattern value="[A-Za-z]*"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

所以可能的值可以是Seat, Opel, "Any string but no Number", "Any string but no special char"

更换

      `<xs:pattern value="[A-Za-z]*"/>`

经过

      <xs:pattern value="[A-Za-z]+"/>

不允许空字符串。这是一种重新定义元素的方法.. 不只是坚持枚举列表。

现在你也有了枚举列表的模式。希望能帮助到你。

于 2013-01-16T11:04:51.337 回答
1

只需像这样添加其他元素

<xsd:simpleType name="carsEnum">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="Seat"/>
        <xsd:enumeration value="Opel"/>
 <xsd:enumeration value="SeatNew"/>
 <xsd:enumeration value="OpelNew"/>
    </xsd:restriction>
</xsd:simpleType>

因此,您将能够将 SeatNew 和 OpelNew 分配给您的 carModel。

但是,除非在中指定,否则您不能为 carModel 分配任意值,因为它将被转换为 java 枚举。

于 2013-01-16T08:33:00.590 回答