Question

En XML, est-il possible de réutiliser des éléments?

Plus précisément, le problème que je tente de résoudre est le suivant. Je souhaite définir un élément table contenant un élément tableSchema et un élément dataSource . Je veux le faire de manière à ce qu'un table puisse faire référence à un tableSchema défini ailleurs. Ainsi, je peux avoir plusieurs rapports définissant des tables conformément au même tableSchema .

Pour clarifier, j'aimerais pouvoir procéder comme suit:

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

et

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

et que tableSchema est barre et toto définis ailleurs, éventuellement dans le même document XML.

Modifié pour ajouter: Ici, par tableSchema, je ne veux pas dire un autre schéma Xml. Je veux dire une définition des champs dans une table . Par exemple, j'aimerais pouvoir effectuer les tâches suivantes:

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

Ensuite, dans ce qui précède, Report1 définit un rapport contenant deux table , l'un formaté conformément au tableSchema foo , et un second formaté conformément à la tableSchema bar , et Report2 définit un rapport contenant un tableau formaté selon le tableSchema toto et ce schéma est identique à celui de Rapport1 .

Était-ce utile?

La solution

Vous n'avez pas fourni de contexte sur ce qui créerait / analyserait ce XML, mais en supposant que vous en ayez le contrôle, vous pouvez définir votre propre convention, par exemple:

<tableSchema ref="foo">

Où l'analyseur chercherait alors un élément avec l'id de "foo". pour récupérer les informations de la tableSchema.

Autres conseils

Pourquoi ne pas simplement inclure la définition? Vous le définissez dans un schéma XML, puis include a> où vous voulez l’utiliser dans un autre schéma XML, comme ceci:

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

Il y a un deuxième aspect à votre question: pour que le document XML puisse spécifier son type de tableSchema , il est.

Voici une analogie avec la programmation OO: (1) définissez une super-classe, (2) définissez foo et bar en tant que sous-classes. Ensuite, (3) définissez le type d’un champ comme étant leur super-classe commune; et maintenant (4). un objet d'exécution peut appartenir à l'une ou l'autre sous-classe. Cela a-t-il du sens? Je pense que c'est ce que vous pensez en tout cas.

Pour compléter l'analogie: en XML, une classe est un complexType ; une sous-classe en est une extension ; un champ est un élément et sa classe est son attribut type - et la classe d'un objet d'exécution est le xsi: type d'un élément dans un document XML . La chose cruciale est cette dernière partie, xsi: type .

(1). Définir la super classe commune - un complexType XML:

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

(2). Définir les sous-classes - extensions du complexType ci-dessus:

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

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

(3). Définissez un champ comme étant de la super-classe - un élément comme étant du type complexe étendu à partir de:

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

(4). Maintenant, le XML peut spécifier qu'un élément est d'un complexType particulier dans le XML lui-même :

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

Notez que le type est spécial et qu’il est défini dans l’espace de noms donné. En fait, plusieurs problèmes liés aux espaces de noms peuvent être frustrants, mais l’essentiel est qu’il soit possible de faire ce que vous voulez.

Pour un exemple plus complet, veuillez consulter le apprêteur de schéma XML .

Vous devrez peut-être utiliser une transformation de feuille de style XSL pour faire ce que vous voulez. Au final, cela aboutira à un XML complet et résolu.

(Je ne comprends peut-être pas encore la question, mais ...) En supposant que vous souhaitiez utiliser les valeurs de texte de tableSchema au pied de la lettre, cela dépend vraiment de votre code de traitement. Le XML est simplement la représentation des données. Vous pouvez donc créer votre propre format, comme suit:

<tableSchema ref="foo"/>

Ensuite, votre outil lit l’ensemble du document et se souvient des définitions de foo et bar (dans un tableau). Ensuite, il commence à traiter les rapports: lorsqu'il utilise Report1 et qu'il voit la référence ci-dessus à foo, il recherche foo dans la table de hachage et l'utilise. Est-ce le genre de chose que vous voulez dire?

Si tel est le cas, l'utilisation de balises ID et IDREF est un peu plus supportée, vous avez donc ceci:

<tableSchema myidref="foo"/>

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

Ensuite, (je pense que) l'outil d'analyse va peupler et rechercher la table pour vous. Vous devez définir myidref et myid de type IDREF et ID dans Schema / DTD, afin que l’analyseur sache les traiter spécialement. Quelque chose comme (montrant juste myidref):

<element name="tableSchema">
  <complexType>
    <xsd:attribute name="myidref" type="xsd:IDREF" use="required"/>
  </complexType>
</element>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top