1

私はここの反対を達成しようとします。抽象クラスがありますが、抽象クラスの型とタグを出力したくありません。したがって、基本的に次のような出力が必要です

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dokument ausgabe="ausgabe_test.doc" vorlage="vorlage_test.dot">
    <marke typ="text" name="test">
        <text>This is a test</text>
    </marke>
</dokument>

それよりも

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dokument ausgabe="ausgabe_test.doc" vorlage="vorlage_test.dot">
    <marke typ="text" name="test">
        <inhalt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="text">
            <text>This is a test</text>
        </inhalt>
    </marke>
</dokument>

Text抽象クラスから継承されInhaltます。

私の現在の(生成された)スキーマを以下に示します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="dokument" type="dokument"/>

  <xs:complexType name="dokument">
    <xs:sequence>
      <xs:element name="marke" type="marke" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="vorlage" type="xs:string" use="required"/>
    <xs:attribute name="ausgabe" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="marke">
    <xs:sequence>
      <xs:element name="inhalt" type="inhalt"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required"/>
    <xs:attribute name="typ" type="markenTyp" use="required"/>
  </xs:complexType>

  <xs:complexType name="inhalt" abstract="true">
    <xs:sequence/>
    <xs:attribute name="style" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="text">
    <xs:complexContent>
      <xs:extension base="inhalt">
        <xs:sequence>
          <xs:element name="text" type="xs:string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:simpleType name="markenTyp">
    <xs:restriction base="xs:string">
      <xs:enumeration value="text"/>
      <xs:enumeration value="tabelle"/>
      <xs:enumeration value="liste"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>
4

1 に答える 1

1

あなたが提供したスキーマに基づいて、私は次のように言います: XML スキーマでの複合型の継承は、Java で期待されるものとまったく同じではないことに注意してください。

スキーマ/オブジェクト モデルには、型inhalttextそれを継承する型があります。inhaltは抽象的です。ここまでは順調ですね。違いは、型の使用法にあります。inhaltタイプを という要素に割り当てますinhalt。つまりinhalt、そこには要素のみが表示され、 は表示されずtext、どのサブタイプが使用されているかを示すために xsi:type オーバーライドが必要です (パーサーはそれを推測できません)。

サブタイピングに加えて置換グループを使用すると、達成したいことを達成できます。これにより、要素textが表示されます。次のようにスキーマをリファクタリングします。

  1. 「inhalt」という名前のグローバル要素を作成し、「inhalt」と入力します (わかりにくいと思われる場合は、型名を大文字にしてください)。
  2. 名前が「text」、タイプが「text」のグローバル要素を作成します。「テキスト」の置換グループ属性を「inhalt」に設定します。
  3. 「marke」のローカル要素参照をグローバル要素への参照に置き換えます。

参考までに、 の新しいモデルを次に示しますmarke

<xs:element name="inhalt" type="inhalt"/>
<xs:element name="text" type="text" substitutionGroup="inhalt"/>
<xs:complexType name="marke">
    <xs:sequence>
        <xs:element ref="inhalt"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required"/>
    <xs:attribute name="typ" type="markenTyp" use="required"/>
</xs:complexType>

この後、 のtext中に現れることがありmarkeます。

于 2010-09-02T12:34:46.180 に答える