質問
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>