質問

XMLでは、要素を再利用できますか?

具体的には、私が解決しようとしている問題は次のとおりです。要素 tableSchema および要素 dataSource を含む要素 table を定義したい。 table が他の場所で定義された tableSchema を参照できるように、これを実行したいと思います。したがって、同じ tableSchema に従って table を定義する複数のレポートを作成できます。

明確にするために、次のことができるようにしたいと思います。

<report name="Report1">
  <page>
    <table>
      <!--reference to tableSchema named "foo"-->
      <dataSource>fooData</dataSource>
    </table>
  </page>
  <page>
    <table> 
      <!--reference to tableSchema named "bar"-->
      <dataSource>barData</dataSource>
    </table>
  </page>
</report>

and

<report name="Report2">
  <page>
    <table>
      <!--reference to tableSchema named "foo" (same as above!)-->
      <dataSource>anotherFooData</dataSource>
    </table>
  </page>
</report>

および tableSchema s bar および foo を別の場所で、おそらく同じXMLドキュメント内で定義します。

追加して編集:ここでは、tableSchemaによって、別のXmlスキーマを意味するわけではありません。 table のフィールドの定義を意味します。たとえば、次のことができるようにしたいと思います。

<tableSchema name="bar">
    <field>
      <displayName>bar1</displayName>
      <sourceName>bar1Source</sourceName>
      <format>Currency</format>
    </field>
    <field>
      <displayName>bar2</displayName>
      <sourceName>bar2Source</sourceName>
      <format>Text</format>
    </field>
</tableSchema>

<tableSchema name="foo">
    <field>
      <displayName>foo1</displayName>
      <sourceName>foo1Source</sourceName>
      <format>Percent</format>
    </field>
</tableSchema>

次に、上記の Report1 は、 tableSchema fooに従ってフォーマットされた2つの table を含むレポートを定義します、および tableSchema bar に従ってフォーマットされた2番目、および Report2 は、1つの table tableSchema foo に従ってフォーマットされ、そのスキーマは Report1 と同じです。

役に立ちましたか?

解決

このXMLの作成/解析に関するコンテキストは提供しませんでしたが、このXMLを制御できると仮定すると、このための独自の規則を定義できます。

<tableSchema ref="foo">

パーサーが&quot; foo&quot;のidを持つ要素を探す場所tableSchema情報を取得します。

他のヒント

なぜ定義だけを含めないのですか? 1つのXMLスキーマで定義し、 include 次のように、別のXMLスキーマで使用したいところならどこでも:

<include schemaLocation="http://www.example.com/schemas/barDef.xsd"/>
<include schemaLocation="http://www.example.com/schemas/fooDef.xsd"/>

質問には2番目の側面があります。XMLドキュメントで、 tableSchema の種類を指定できるようにするためです。

オブジェクト指向プログラミングとの類推です:(1)スーパークラスを定義し、(2)fooとbarをそのサブクラスとして定義します。次に、(3)フィールドのタイプを共通のスーパークラスに定義します。そして今(4)。ランタイムオブジェクトは、どちらのサブクラスにもできます。それは理にかなっていますか?とにかくあなたが考えていることだと思います。

類推を完了するために:XMLでは、クラスは complexType です。サブクラスはその拡張です。フィールドは要素であり、そのクラスは type 属性です-ランタイムオブジェクトのクラスは xsi:type > XMLドキュメントの要素。重要なのは、最後の部分である xsi:type です。

(1)。共通のスーパークラス-XML complexTypeを定義します:

<complexType name="MySuperType">
  ...
</complexType>

(2)。サブクラスを定義します-上記のcomplexTypeの拡張:

<complexType name="Foo">
  <complexContent>
    <extension base="MySuperType">
      ...
    </extension>
  </complexContent>
</complexType>

<complexType name="Bar">
  <complexContent>
    <extension base="MySuperType">
      ...
    </extension>
  </complexContent>
</complexType>

(3)。スーパークラスになるようにフィールドを定義します-以下から拡張されたcomplexTypeになる要素:

<element name="tableSchema" type="mySuperType"/>

(4)。これで、XMLは、要素が特定のcomplexTypeであることをXML自体で指定することができます

<report xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <page>
    <table>
      <tableSchema xsi:type="foo"/>
      <dataSource>fooData</dataSource>
    </table>
  </page>
  <page>
    <table> 
      <tableSchema xsi:type="bar"/>
      <dataSource>barData</dataSource>
    </table>
  </page>
</report>

type は特別であり、指定された名前空間で定義されていることに注意してください。実際、イライラする可能性のある名前空間の問題がいくつかありますが、重要なことは、あなたがやりたいことを できることです。

より完全な例については、 XML Schema Primer をご覧ください。

XSLスタイルシート変換を使用して、必要な処理を行う必要がある場合があります。最終的には、完全で解決されたXMLになります。

(質問をまだ理解していないかもしれませんが...)tableSchemaのテキスト値を文字通り使用したい場合、処理コード次第です。 XMLは単なるデータの表現です。したがって、次のように独自の形式を作成できます。

<tableSchema ref="foo"/>

ツールはドキュメント全体を読み取り、fooとbarの定義を(テーブルに)記憶します。次に、Reportsの処理を開始します。Report1を使用し、上記のfooへの参照を確認すると、ハッシュテーブルでfooを検索して使用します。そういうことですか?

もしそうなら、IDタグとIDREFタグを使用することで、これに対するもう少しのサポートがあるので、これがあります:

<tableSchema myidref="foo"/>

<tableSchema myid="foo">
    <field>
      <displayName>foo1</displayName>
      <sourceName>foo1Source</sourceName>
      <format>Percent</format>
    </field>
</tableSchema>

その後、(私が思うに)解析ツールがテーブルを生成して検索します。スキーマ/ DTDのタイプIDREFおよびIDとしてmyidrefおよびmyidを定義する必要があるため、パーサーはそれらを特別に処理することを認識しています。次のようなもの(myidrefを表示するだけです):

<element name="tableSchema">
  <complexType>
    <xsd:attribute name="myidref" type="xsd:IDREF" use="required"/>
  </complexType>
</element>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top