Domanda

In XML, è possibile riutilizzare gli elementi?

In particolare, il problema che sto cercando di risolvere è il seguente. Voglio definire un elemento table che contiene un elemento tableSchema e un elemento dataSource . Voglio fare questo in modo che una tabella s possa fare riferimento a una tableSchema definita altrove. Pertanto, posso avere più report che definiscono table secondo lo stesso tableSchema .

Per chiarire, vorrei poter fare quanto segue:

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

e

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

e hanno tableSchema s bar e foo definiti altrove, possibilmente nello stesso documento XML.

Modificato per aggiungere: qui, per tableSchema, non intendo un altro schema Xml. Intendo una definizione dei campi in una tabella . Ad esempio, vorrei poter fare quanto segue:

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

Quindi, in precedenza, Report1 definisce un report che contiene due table , uno formattato in base al tableSchema foo e un secondo formattato in base alla tableSchema bar e Report2 definisce un report che contiene una table formattato in base al tableSchema foo e lo schema è lo stesso di Report1 .

È stato utile?

Soluzione

Non hai fornito il contesto su cosa sarebbe creare / analizzare questo XML ma supponendo che tu ne abbia il controllo, puoi definire la tua convenzione per questo, ad esempio:

<tableSchema ref="foo">

Dove il parser avrebbe quindi cercato un elemento con l'id di " foo " per recuperare le informazioni su tableSchema.

Altri suggerimenti

Perché non includere solo la definizione? Lo definisci in uno schema XML, quindi include ovunque tu voglia usarlo in un altro schema XML, come questo:

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

C'è un secondo aspetto nella tua domanda: che il documento XML sia in grado di specificare che tipo di tableSchema è.

Ecco un'analogia con la programmazione OO: (1) definire una superclasse, (2) definire foo e bar come sottoclassi di essa. Quindi, (3) definire il tipo di un campo per essere della loro superclasse comune; e ora (4). un oggetto runtime può di entrambe le sottoclassi. Ha senso? Penso che sia quello che stai pensando in termini comunque.

Per completare l'analogia: in XML, una classe è un complexType ; una sottoclasse è una estensione ; un campo è un elemento e la sua classe è il suo tipo - e la classe di un oggetto runtime è il xsi: tipo di un elemento in un documento XML . La cosa cruciale è l'ultima parte, xsi: type .

(1). Definisci la superclasse comune - un XML complexType:

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

(2). Definire le sottoclassi - estensioni del suddetto complexType:

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

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

(3). Definire un campo per essere della superclasse - un elemento per essere del tipo complesso esteso da:

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

(4). Ora l'XML può specificare che un elemento è di un particolare complexType nell'XML stesso :

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

Nota che il tipo è speciale ed è definito nello spazio dei nomi indicato. In effetti, ci sono diversi problemi relativi allo spazio dei nomi che possono essere frustranti, ma la cosa fondamentale è che è possibile fare quello che vuoi.

Per un esempio più completo, consultare XML Schema Primer .

Potrebbe essere necessario utilizzare una trasformazione del foglio di stile XSL per fare ciò che desideri. Alla fine si tradurrà in un XML completo e risolto.

(Potrei non capire ancora la domanda, ma ...) Supponendo che tu voglia usare letteralmente i valori di testo in tableSchema, allora dipende davvero dal tuo codice di elaborazione. L'XML è solo la rappresentazione dei dati. Quindi potresti creare il tuo formato, come questo dire:

<tableSchema ref="foo"/>

Quindi il tuo strumento legge l'intero documento e ricorda le definizioni di foo e bar (in una tabella). Quindi, inizia a elaborare i rapporti: quando usa Report1 e vede il riferimento sopra a pippo, cerca pippo nella tabella hash e lo usa. È questo il genere di cose che intendi?

In tal caso, c'è un po 'più di supporto per questo usando i tag ID e IDREF, quindi hai questo:

<tableSchema myidref="foo"/>

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

Quindi, (penso) lo strumento di analisi popolerà e cercherà la tabella per te. È necessario definire myidref e myid come di tipo IDREF e ID nello schema / DTD, in modo che il parser sappia trattarli in modo speciale. Qualcosa di simile (mostrando solo myidref):

<element name="tableSchema">
  <complexType>
    <xsd:attribute name="myidref" type="xsd:IDREF" use="required"/>
  </complexType>
</element>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top