0

假设我的架构中有一个自定义数据类型:

  <xs:element name="Fruit">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Name"/>
        <xs:element ref="Supplier"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="Name" type="xs:NCName"/>
  <xs:element name="Supplier" type="xs:string"/>

在架构的其他地方,我想需要 Fruit 的特定实例,所以我有类似以下 XML 文件的内容:

<fruits>
  <common>
    <!-- the common section should always include Fruits with these Names -->
    <Fruit>
      <Name>apple</Name>
      <Supplier>Shady Orchard</Supplier>
    </Fruit>
    <Fruit>
      <Name>orange</Name>
      <Supplier>Florida Orange Co.</Supplier>
    </Fruit>
    <Fruit>
      <Name>banana</Name>
      <Supplier>Bananaland</Supplier>
    </Fruit>
  </common>
  <exotic>
    <Fruit>
      <Name>kiwano</Name>
      <Supplier>Fancy Fruits</Supplier>
    </Fruit>
    <Fruit>
      <Name>rambutan</Name>
      <Supplier>Indonesia Fruit Co.</Supplier>
    </Fruit>
    <!-- the list goes on... -->
  </exotic>
</fruits>

我知道我可以像这样在我的文件中定义异国情调的部分:

  <xs:element name="exotic">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="Fruit"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

但是我如何定义公共部分,以便始终需要Fruit名称为appleorangebanana的 s ?

4

1 回答 1

1

解决这个问题并不难。我很确定有一个更优雅的解决方案,但这会起作用。唯一的事情是,我们并不真正需要特定的实例,而是创建专门的类型来仅匹配这些值。我很确定有一种方法可以通过固定值来不受类型限制,但我不记得该属性,也不知道它是否可以使用三个值的替代方法。

这是一个xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/FruitSchema"
xmlns:fr="http://www.example.org/FruitSchema" xmlns:tns="http://www.example.org/FruitSchema"
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="fruits">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="fr:common" minOccurs="1" maxOccurs="1"/>
            <xs:element ref="fr:exotic" minOccurs="1" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="fruit">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="fr:name" />
            <xs:element ref="fr:supplier" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="name" type="xs:NCName" />
<xs:element name="supplier" type="xs:string" />

<xs:element name="exotic">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="unbounded" ref="fr:fruit" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:element name="common">
    <xs:complexType>
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="fruit">
                <xs:complexType>
                    <xs:sequence minOccurs="1" maxOccurs="1">
                        <xs:element name="name" type="fr:CommonFruitType" />
                        <xs:element ref="fr:supplier" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:simpleType name="CommonFruitType">
    <xs:restriction base="xs:NCName">
        <xs:enumeration value="apple" />
        <xs:enumeration value="orange" />
        <xs:enumeration value="banana" />
    </xs:restriction>
</xs:simpleType>

这是一个验证失败的例子。

<?xml version="1.0" encoding="UTF-8"?>
<fruits xmlns="http://www.example.org/FruitSchema" xmlns:fr="http://www.example.org/FruitSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/FruitSchema FruitSchema.xsd">
    <common>
        <!-- the common section should always include fruits with these names -->
        <fruit>
            <name>apple</name>
            <supplier>Shady Orchard</supplier>
        </fruit>
        <fruit>
            <name>apple</name>
            <supplier>Shady Orchard</supplier>
        </fruit>
        <fruit>
            <name>orange</name>
            <supplier>Florida Orange Co.</supplier>
        </fruit>
        <fruit>
            <name>banana</name>
            <supplier>Bananaland</supplier>
        </fruit>
        <fruit>
            <name>kiwano</name>
            <supplier>Fancy fruits</supplier>
        </fruit>
    </common>
    <exotic>
        <fruit>
            <name>kiwano</name>
            <supplier>Fancy fruits</supplier>
        </fruit>
        <fruit>
            <name>rambutan</name>
            <supplier>Indonesia fruit Co.</supplier>
        </fruit>
        <!-- the list goes on... -->
    </exotic>
</fruits>

它仅验证 中的那些水果common,即苹果、橙子或香蕉,无论供应商是什么。

于 2012-05-25T00:24:20.517 回答