1

私は多くのサイトを調べてから、他の属性が属性の値に依存する Xml スキーマを作成しました。

以下の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 スキーマの独自の拡張機能でしょうか?

XSD 1.1 標準には、xs:alternative と呼ばれる要素を使用して、これに少し似た条件付き型割り当てと呼ばれる機能があります。XSD 1.1 は、Xerces および Saxon の最近のバージョンでサポートされています。

于 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 を続行して、1 回のパスで解析できます。

<?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 に答える