Pregunta

En XML, ¿es posible reutilizar elementos?

Específicamente, el problema que estoy tratando de resolver es el siguiente. Quiero definir un elemento table que contenga un elemento tableSchema y un elemento dataSource . Quiero hacer esto de manera que una table s pueda referirse a un tableSchema definido en otro lugar. Por lo tanto, puedo tener múltiples informes que definen table s de acuerdo con el mismo tableSchema .

Para aclarar, me gustaría poder hacer lo siguiente:

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

y

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

y tener tableSchema s bar y foo definidos en otra parte, posiblemente en el mismo documento XML.

Editado para agregar: Aquí, por tableSchema, no me refiero a otro esquema Xml. Me refiero a una definición de los campos en una tabla . Por ejemplo, me gustaría poder hacer lo siguiente:

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

Luego, en lo anterior, Report1 define un informe que contiene dos table s, uno formateado de acuerdo con el tableSchema foo , y un segundo formateado según la tableSchema bar , y Report2 define un informe que contiene una tabla que está formateado de acuerdo con tableSchema foo y ese esquema es el mismo que en Report1 .

¿Fue útil?

Solución

No proporcionó contexto en cuanto a lo que estaría creando / analizando este XML, pero suponiendo que tenga control sobre esto, entonces podría definir su propia convención para esto, por ejemplo:

<tableSchema ref="foo">

Donde el analizador buscaría un elemento con la identificación de " foo " para recuperar la información de tableSchema.

Otros consejos

¿Por qué no solo incluir la definición? Lo define en un esquema XML, luego include donde quiera usarlo en otro esquema XML, como este:

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

Hay un segundo aspecto en su pregunta: para que el documento XML pueda especificar qué tipo de tableSchema es.

Aquí hay una analogía con la programación OO: (1) define una superclase, (2) define foo y bar como subclases de la misma. Luego, (3) defina el tipo de campo para que sea de su superclase común; y ahora (4). un objeto de tiempo de ejecución puede de cualquiera de las subclases. ¿Tiene sentido? Creo que es lo que estás pensando en términos de todos modos.

Para completar la analogía: en XML, una clase es un complexType ; una subclase es una extensión de la misma; un campo es un elemento y su clase es su atributo tipo , y la clase de un objeto de tiempo de ejecución es el xsi: tipo de un elemento en un documento XML . Lo crucial es esa última parte, xsi: type .

(1). Defina la superclase común: un XML complexType:

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

(2). Defina las subclases: extensiones del tipo complejo anterior:

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

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

(3). Defina un campo para que sea de la superclase: un elemento para que sea del complexType extendido desde:

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

(4). Ahora el XML puede especificar que un elemento es de un tipo complejo particular en el propio 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>

Tenga en cuenta que type es especial y se define en el espacio de nombres dado. De hecho, hay varios problemas de espacio de nombres que pueden ser frustrantes, pero la clave es que es posible hacer lo que quiera.

Para obtener un ejemplo más completo, consulte el XML Schema Primer .

Puede que tenga que usar una transformación de hoja de estilo XSL para hacer lo que quiera. Al final, dará como resultado un XML completo y resuelto.

(Puede que todavía no entienda la pregunta, pero ...) Suponiendo que quiere usar los valores de texto en el esquema de tabla literalmente, entonces depende realmente de su código de procesamiento. El XML es solo la representación de los datos. Para que pueda crear su propio formato, como este decir:

<tableSchema ref="foo"/>

Luego, su herramienta lee todo el documento y recuerda las definiciones de foo y bar (en una tabla). Luego, comienza a procesar los Informes: cuando va a usar Report1, y ve la referencia anterior a foo, busca foo en la tabla hash y lo usa. ¿Es ese el tipo de cosas que quieres decir?

Si es así, hay un poco más de soporte para esto con el uso de etiquetas ID e IDREF, por lo que tiene esto:

<tableSchema myidref="foo"/>

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

Entonces, (creo) la herramienta de análisis se completará y buscará la tabla por usted. Debe definir myidref y myid como de tipo IDREF e ID en el esquema / DTD, por lo que el analizador sabe tratarlos especialmente. Algo así (solo mostrando myidref):

<element name="tableSchema">
  <complexType>
    <xsd:attribute name="myidref" type="xsd:IDREF" use="required"/>
  </complexType>
</element>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top