1

我浏览了许多站点,然后创建了 Xml Schema,其中其他属性取决于其中一个属性的值。

下面的xml文件:

<?xml version="1.0"?>
<Main>
  <Matter kind="fruits" calories="10" name="apple" quantity="10" color="red"/>
  <Matter kind="car" brand="ford" name="ikon" quantity="1" color="red"/>
  <Matter kind="country" continent="Asia" name="japan"/>
</Main>

kind 属性可以有水果、汽车和国家。并且根据属性需要其他参数,例如国家值,需要大洲属性。

下面是XSD文件,

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="Main">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="Matter"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Matter">
    <xs:complexType>
      <xs:attribute name="name" use="required" type="xs:NCName"/>
      <xs:alt cond="@kind='fruits'"> 
      <xs:attribute name="kind" use="required" type="xs:NCName" fixed="fruits"/>
      <xs:attribute name="color" type="xs:NCName"/>
      <xs:attribute name="quantity" type="xs:integer"/>
      </xs:alt>
      <xs:alt cond="@kind='car'"> 
      <xs:attribute name="kind" use="required" type="xs:NCName" fixed="car"/>
      <xs:attribute name="brand" type="xs:NCName"/>
      <xs:attribute name="quantity" type="xs:integer"/>
      <xs:attribute name="color" type="xs:NCName"/>
      </xs:alt>
      <xs:alt cond="@kind='country'"> 
      <xs:attribute name="kind" use="required" type="xs:NCName" fixed="country"/>
      <xs:attribute name="continent" type="xs:NCName" use="required"/>
      </xs:alt>
    </xs:complexType>
  </xs:element>
</xs:schema>

当我使用上述 XSD 验证 XML 文件时,我收到错误消息“元素 alt 无效、放错位置或经常发生。

请帮助我使用适当的 XSD 验证上述文件。

4

3 回答 3

1

我不知道你从哪里得到 xsl:alt 的想法。也许是 XML Schema 的一些专有扩展?

XSD 1.1 标准有一个称为条件类型分配的工具,有点像这样,带有一个称为 xs:alternative 的元素。Xerces 和 Saxon 的最新版本支持 XSD 1.1。

于 2012-11-07T18:29:07.457 回答
0

我想你应该使用xs:extension如下。这是一个示例 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Main xmlns="http://www.example.com/matters">
    <Fruit calories="10" name="apple" quantity="10" color="red"/>
    <Car brand="ford" name="ikon" quantity="1" color="red"/>
    <Car brand="dodge" name="fire" quantity="1" color="blue"/>
    <Country continent="Asia" name="Japan"/>
    <Country continent="Europe" name="Italy"/>
</Main>

这是此 XML 的 XSD。唯一的限制是相同类型的元素应该按顺序分组。您也可以添加固定属性,但由于标签的名称表示类型,我发现它们没有必要。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.example.com/matters" xmlns="http://www.example.com/matters" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <!-- document structure -->
    <xs:element name="Main">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Fruit" type="fruitType" minOccurs="0" maxOccurs="unbounded" />
                <xs:element name="Car" type="carType" minOccurs="0" maxOccurs="unbounded" />
                <xs:element name="Country" type="countryType" minOccurs="0" maxOccurs="unbounded" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <!-- types definitions -->
    <xs:complexType name="matterType">
        <xs:attribute name="name" use="required" type="xs:NCName"/>
    </xs:complexType>
    <xs:complexType name="fruitType">
        <xs:complexContent>
            <xs:extension base="matterType">
                <xs:attribute name="color" type="xs:NCName"/>
                <xs:attribute name="quantity" type="xs:integer"/>
                <xs:attribute name="calories" type="xs:integer"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="carType">
        <xs:complexContent>
            <xs:extension base="matterType">
                <xs:attribute name="brand" type="xs:NCName"/>
                <xs:attribute name="quantity" type="xs:integer"/>
                <xs:attribute name="color" type="xs:NCName"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="countryType">
        <xs:complexContent>
            <xs:extension base="matterType">
                <xs:attribute name="continent" type="xs:NCName" use="required"/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>
于 2013-01-17T07:40:24.970 回答
0

看起来您正在尝试从另一种类型中创建一种类型。我认为您应该使用自己的规则重构和创建新类型。然后,您可以继续使用原始修改的 xsd 并一次性解析。

<?xml version="1.0"?>
<Main>
    <fruits calories="10" name="apple" quantity="10" color="red"/>
    <car brand="ford" name="ikon" quantity="1" color="red"/>
    <country continent="Asia" name="japan"/>
</Main>
于 2013-12-06T11:28:25.460 回答