XML - Transformacion XML

 
Vista:

Transformacion XML

Publicado por Mario (1 intervención) el 31/01/2006 07:49:04
Hola a todos,
acabo de darme de alta en el grupo y comienzo con una duda.

Necesito generar un documento Xml a partir de otro documento Xml que no está muy bien definido.
El problema es que cada nodo de tipo "Layer" está formado por diferentes
nodo con nombre "Layer" también aunque no representan el mismo tipo de objetos.

La primera Layer que encuentro es la "padre" de todas las layers y esa en
concreto no me interesa.
Necesito distinguir las layers que "cuelgan" directamente de este nodo padre
para poder generar un Xml mejor "estructurado".
El xml origen es algo así:

<service name="layers">
<Layer queryable="0">
<Title>World</Title>
<Abstract />
<SRS>GENS:utm_30N</SRS>
<LatLonBoundingBox minx="717295098.500000" miny="364650938.000000"
maxx="736469337.500000" maxy="378346823.000000" />
<Visible />
---->>> Este nivel representa una base de datos
<Layer queryable="0">
<Title>Gis</Title>
<Abstract />
<Visible>True</Visible>
---->>> Este nivel representa un objeto de base de datos
<Layer queryable="0">
<Layer queryable="0">
<Name>swrefVcollectionVdatasetZgisVcollectionZdesarrolloUrbano</Name>
<Title>Desarrollo Urbanístico</Title>
<Abstract />
<Visible>False</Visible>
</Layer>
---->>> Este nivel representa una agrupación de objetos de la base de datos pero que tiene los mismo atributos que la base de datos.
<Title>REFERENCIAS CARTOGRAFICAS</Title>
<Abstract />
<Visible>True</Visible>
---->>> Este nivel representa un objeto de base de datos que está en la
agrupacion anterior
<Layer queryable="0">
<Name>swrefVcollectionVdatasetZgisVcollectionZcalle</Name>
<Title>Calle</Title>
<Abstract />
<Visible>False</Visible>
</Layer>

El documento Xml resultante quiero que distinga los diferentes elementos del
documento cambiando el nombre del nodo.
Por ejemplo usar <base_datos>, <agrupacion> y dejar <layer> exclusivamente
para los objetos de tipo "layer".

Podría ser algo así:

<base_datos nombre="Gis">
<Layer queryable="0">
---> Para un objeto que no esta agrupado
<Name>swrefVcollectionVdatasetZgisVcollectionZcalle</Name>
<Title>Calle</Title>
<Abstract />
<Visible>False</Visible>
</Layer>
<agrupacion>
<Title>REFERENCIAS CARTOGRAFICAS</Title>
<Abstract />
<Visible>True</Visible>
<Layer[/B] queryable="0">
<Name>swrefVcollectionVdatasetZgisVcollectionZcalle</Name>
<Title>Calle</Title>
<Abstract />
<Visible>False</Visible>
</Layer>
....
</agrupacion>

</base_datos>

El problema es que no se cómo puedo "detectar" el nivel de profundidad en el
que me encuentro ya que ésto es lo que me diferencia una base de datos de
una agrupación. Los "objetos" al tener campos distintos si puedo
distinguirlos. Probé a usar xsl:variable pero tras darde de tortas con el
código me di cuenta que realmente son constantes y no me ayuda esto mucho.

Acabo de empezar con el XSL y cualquier ayuda me será útil.

Saludos y gracias de antemano.
Mario
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Generación de un documento XML estructurado a partir de otro documento XML desordenado

Publicado por Alejandro (258 intervenciones) el 12/07/2023 22:10:59
Para lograr la transformación deseada y generar un documento XML estructurado a partir de otro documento XML desordenado, puedes utilizar XSLT (Extensible Stylesheet Language Transformations). A continuación, te proporciono un ejemplo de cómo podrías aplicar XSLT para obtener el resultado deseado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<!-- Documento XSLT -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
  <!-- Template para el elemento raíz -->
  <xsl:template match="/">
    <xsl:apply-templates select="service/Layer" />
  </xsl:template>
 
  <!-- Template para los elementos "Layer" que cuelgan directamente del nodo padre -->
  <xsl:template match="service/Layer[not(ancestor::Layer)]">
    <base_datos nombre="{Title}">
      <xsl:apply-templates select="node()" />
    </base_datos>
  </xsl:template>
 
  <!-- Template para los elementos "Layer" que representan agrupaciones -->
  <xsl:template match="Layer[ancestor::Layer]">
    <agrupacion>
      <xsl:apply-templates select="node()" />
    </agrupacion>
  </xsl:template>
 
  <!-- Template para los elementos "Layer" que representan objetos de base de datos -->
  <xsl:template match="Layer[not(ancestor::Layer)][not(ancestor::Layer/ancestor::Layer)]">
    <Layer queryable="{@queryable}">
      <xsl:apply-templates select="node()" />
    </Layer>
  </xsl:template>
 
  <!-- Copiar todos los nodos por defecto -->
  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*" />
    </xsl:copy>
  </xsl:template>
 
</xsl:stylesheet>

En este ejemplo de XSLT, se utilizan diferentes templates para identificar y transformar los distintos elementos del documento XML desordenado. El template principal se aplica al elemento raíz y selecciona los elementos "Layer" que cuelgan directamente del nodo padre. Luego, se aplican templates específicos para los elementos "Layer" que representan agrupaciones y objetos de base de datos. Además, se utiliza el atributo "nombre" en el elemento "base_datos" para capturar el valor del título.

Puedes aplicar este XSLT a tu documento XML utilizando una herramienta o lenguaje de programación compatible con XSLT, como Java, C#, PHP, etc. El resultado será un nuevo documento XML estructurado según tus requisitos.

Espero que esta solución te ayude a generar el documento XML estructurado a partir del XML desordenado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar