1

次の XML が有効な XSD のセクションを定義しようとしています。

<machine>
    <timing offset="3s" period="20s"/>

    <!-- <machine> actually has many child elements, all of them are like <timing>
         and only have attributes -->
</machine>

これが私がこれまでに持っているものです:

<xs:element name="machine">
    <xs:complexType>
        <xs:all>
            <!-- Definition for the <timing> child element. -->
            <xs:element name="timing" type="timing_type"/>
            <xs:complexType name="timing_type">
                <xs:attribute name="offset" type="xs:string"/>
                <xs:attribute name="period" type="xs:string"/>
            </xs:complexType>

            <!-- Definitions for the other <machine> child elements... -->
        </xs:all>
    </xd:complexType>
</xs:element>

の行<xs:complexType name="timing_type">に、次のエラー メッセージが表示されます。

コンポーネント「timing_type」の解決中にエラーが発生しました。「timing_type」が名前空間「http://www.w3.org/2001/XMLSchema」にあることが検出されましたが、この名前空間のコンポーネントはスキーマ ドキュメント「file:////mySchema.xsd」から参照できません。これが正しくない名前空間である場合、おそらく「timing_type」のプレフィックスを変更する必要があります。これが正しい名前空間である場合は、適切な「インポート」タグを「file:////mySchema.xsd」に追加する必要があります。

ここで私が間違っていることはありますか?<machine>すべてが単純で、子を持たず、属性のみを持つために、たくさんの子を定義するにはどうすればよいですか? 前もって感謝します!

4

1 に答える 1

3

あなたは XSD を学習しているようなので、より完全な XML サンプルを作成し、ツールを使用してこれらすべてのサンプル XML から XSD を生成する方が簡単かもしれません。生成された XSD から多くのことを学ぶことができ、目標に合わせて段階的に変更することが容易になるはずです。

xs:schemaエラーは、または以外の下に名前付き型をネストできないことですxs:redefine

したがって、以下のように見える場合、切り取ったものは正しいでしょう。

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="machine">
        <xs:complexType>
            <xs:all>
                <!-- Definition for the <timing> child element. -->
                <xs:element name="timing" type="timing_type"/>
                <!-- Definitions for the other <machine> child elements... -->
            </xs:all>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="timing_type">
        <xs:attribute name="offset" type="xs:string"/>
        <xs:attribute name="period" type="xs:string"/>
    </xs:complexType>
</xs:schema>

遭遇する可能性のある問題は、またはのxs:all代わりに を使用することに関連しています。XSD 1.0 では、要素に対して複数のオカレンスを持つことができないという点で非常にうるさいです。xs:sequencexs:choicexs:alltiming

以下の XSD は、ツールによって生成されました。これは、追加したバリエーション (maxOccurs="unbounded") を可能にする( allの代わりに)シーケンスコンポジターを使用します。

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="machine">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="timing" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:attribute name="offset" type="xsd:string" use="required" />
            <xsd:attribute name="period" type="xsd:string" use="required" />
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

ミックスに別のタイプの要素を追加し(提案したように)、そのような要素を任意の数、個別に複数回、任意の順序で発生させたい場合、以下のモデルが機能します。ここで注目すべきは、xsd:choice maxOccurs="unbounded"

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="machine">
    <xsd:complexType>
      <xsd:choice maxOccurs="unbounded">
        <xsd:element name="timing">
          <xsd:complexType>
            <xsd:attribute name="offset" type="xsd:string" use="required" />
            <xsd:attribute name="period" type="xsd:string" use="required" />
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="cycle">
          <xsd:complexType>
            <xsd:attribute name="duration" type="xsd:positiveInteger" use="required" />
            <xsd:attribute name="period" type="xsd:positiveInteger" use="required" />
          </xsd:complexType>
        </xsd:element>          
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
于 2012-09-29T22:06:57.320 に答える