Foros del Web » Creando para Internet » Diseño web »

Adaptacion de un XML con XSL

Estas en el tema de Adaptacion de un XML con XSL en el foro de Diseño web en Foros del Web. Buenas, Tengo un ligero problema con un XML y un XSL. El caso es que no se como hacer la transformación para que quede como ...
  #1 (permalink)  
Antiguo 07/03/2013, 02:10
 
Fecha de Ingreso: octubre-2008
Mensajes: 6
Antigüedad: 16 años, 1 mes
Puntos: 0
Adaptacion de un XML con XSL

Buenas,

Tengo un ligero problema con un XML y un XSL. El caso es que no se como hacer la transformación para que quede como lo necesitamos.

Este es nuestro XML

<CONCEPTO>
<DESCRIPCION>TEXTO HIJO</DESCRIPCION>
<BT level="1">TEXTO PADRE 1
<BT level="2">TEXTO PADRE 2
<BT level="3">TEXTO PADRE 3
<BT level="4">TEXTO PADRE 4

</BT>
</BT>
</BT>
</BT>
</CONCEPTO>

Y el resultado que estamos intentando es... TEXTO HIJO: TEXTO PADRE 1, TEXTO PADRE 2, TEXTO PADRE 3, TEXTO PADRE 4 |

Como se observa necesito que los nodos BT se separen con comas pero lo que me muestra ahora mismo TEXTO HIJO: TEXTO PADRE 1 TEXTO PADRE 2 TEXTO PADRE 3 TEXTO PADRE 4 | ... vamos sin comas...

Como tendria que "recorrer" esos nodos aninados para conseguir lo que quiero??? Antes de nada indicar que los nodos BT no son solo 4, son dinamicos, es decir, puede existir level 1 como hasta level 30.

Gracias!!!

Última edición por ODIOelSEA; 07/03/2013 a las 03:30
  #2 (permalink)  
Antiguo 07/03/2013, 17:39
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 7 meses
Puntos: 1284
Respuesta: Adaptacion de un XML con XSL

Hola:

Encuentro esa estructura un poco extraña... estás obligado o puedes cambiarla... yo veo más coherente que los BT sean una lista, y los recorrerías con un simple xsl:for-each.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 08/03/2013, 01:14
 
Fecha de Ingreso: octubre-2008
Mensajes: 6
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Adaptacion de un XML con XSL

Cita:
Iniciado por caricatos Ver Mensaje
Hola:

Encuentro esa estructura un poco extraña... estás obligado o puedes cambiarla... yo veo más coherente que los BT sean una lista, y los recorrerías con un simple xsl:for-each.

Saludos
Por desgracia estamos obligados a usar esa estructura ya que lo genera un programa, al cual no le puedoemos indicar la estructura. Acabo de fijarme que tambien puede tener otra posibilidad...

<RAMA>
<CONCEPTO>
<DESCRIPCION>TEXTO HIJO</DESCRIPCION>

<BT level="1">TEXTO PADRE 1
<BT level="2">TEXTO PADRE 2
<BT level="3">TEXTO PADRE 3
<BT level="4">TEXTO PADRE 4

</BT>
</BT>
</BT>
</BT>

<BT level="1">TEXTO OTRO 1
<BT level="2">TEXTO OTRO 2
<BT level="3">TEXTO OTRO 3
<BT level="4">TEXTO OTRO 4

</BT>
</BT>
</BT>
</BT>
</CONCEPTO>
</RAMA>

En este caso tendría que mostrar...
TEXTO HIJO: TEXTO PADRE 1, TEXTO PADRE 2, TEXTO PADRE 3, TEXTO PADRE 4 |
TEXTO HIJO: TEXTO OTRO 1, TEXTO OTRO 2, TEXTO OTRO 3, TEXTO OTRO 4 |

Hemos conseguido parte pero no tengo mucha idea de como mostrar un parametro "creado" en un template usarlo en otro...

<xsl:template match="/">

<xsl:for-each select="RAMA/CONCEPTO">

<xsl:if test="DESCRIPCION">
<xsl:param name="decrip"><xsl:apply-templates select="DESCRIPCION " />:</xsl:param> <xsl:apply-templates select="BT"/>|<xsl:text>
</xsl:text><separator/>
</xsl:if>

<xsl:if test="UF">
<xsl:apply-templates select="UF"/>: <xsl:apply-templates select="BT"/>|<xsl:text>
</xsl:text><separator/>
</xsl:if>
</xsl:for-each>

</xsl:template>

<xsl:template match="BT">
<xsl:if test="@level =1"><xsl:text>$decrip</xsl:text>
</xsl:if>
<xsl:value-of select="normalize-space(text())"/>
<xsl:if test="BT">,<xsl:apply-templates select="BT" /></xsl:if>
</xsl:template>

Este es el xsl que tenemos de momento, el UF es simplemente que puede venir UF en vez de DESCRIPCION.

Gracias
  #4 (permalink)  
Antiguo 08/03/2013, 11:42
 
Fecha de Ingreso: marzo-2003
Ubicación: onde toy?
Mensajes: 1.437
Antigüedad: 21 años, 8 meses
Puntos: 9
Respuesta: Adaptacion de un XML con XSL

Estoy casi casi.. solo me falta eliminar la última coma, pero básicamente utilicé una variable y un for-each... es más menos lo que necesitas??

Código:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:variable name="texto">
 <xsl:value-of select="CONCEPTO/DESCRIPCION"/>:   
    <xsl:for-each select="//BT">             
       <xsl:value-of select="concat(.,',')"/>     
    </xsl:for-each>                     
</xsl:variable>

	<xsl:value-of select="$texto"/>

   </xsl:template>
</xsl:stylesheet>
Esto me está devolviendo lo siguiente
TEXTO HIJO: TEXTO PADRE 1,TEXTO PADRE 2,TEXTO PADRE 3,TEXTO PADRE 4,
__________________
Buena Vida...
Francisco
  #5 (permalink)  
Antiguo 08/03/2013, 11:50
 
Fecha de Ingreso: marzo-2003
Ubicación: onde toy?
Mensajes: 1.437
Antigüedad: 21 años, 8 meses
Puntos: 9
Respuesta: Adaptacion de un XML con XSL

mmm creo que canté victoria demasiado rápido y yo modifiqué el XML XD ...vuelta de nuevo a probar XD
__________________
Buena Vida...
Francisco
  #6 (permalink)  
Antiguo 12/03/2013, 03:33
 
Fecha de Ingreso: octubre-2008
Mensajes: 6
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Adaptacion de un XML con XSL

Buenas cuando parecia resuelto nos hemos dado cuenta de que estaba mal..

tenemos el XML
<RAMA>
<CONCEPTO>
<DESCRIPCION>TEXTO HIJO</DESCRIPCION>

<BT level="1">TEXTO PADRE 1
<BT level="2">TEXTO PADRE 2
<BT level="3">TEXTO PADRE 3
<BT level="4">TEXTO PADRE 4

</BT>
</BT>
</BT>
</BT>

<BT level="1">TEXTO OTRO 1
<BT level="2">TEXTO OTRO 2
<BT level="3">TEXTO OTRO 3
<BT level="4">TEXTO OTRO 4

</BT>
</BT>
</BT>
</BT>
</CONCEPTO>
</RAMA>

el cual tiene que aparecer..
TEXTO HIJO: TEXTO PADRE 4, TEXTO PADRE 3, TEXTO PADRE 2, TEXTO PADRE 1 |
es decir, totalmente al reves!!!

Este es el xsl que tenemos...

Código HTML:
 <xsl:template match="/">
		<xsl:for-each select="RAMA/CONCEPTO">
			<xsl:if test="DESCRIPCION">
				<xsl:param name="valorDescriptor"><xsl:value-of select="DESCRIPCION"/>:</xsl:param> 
				<xsl:choose>
					<xsl:when test="BT">
						<xsl:apply-templates select="BT"><xsl:with-param name="valor" select="$valorDescriptor"/></xsl:apply-templates>
					</xsl:when>
					<xsl:otherwise>
						<xsl:choose>
							<xsl:when test="RT"/>
							<xsl:otherwise><xsl:text>
</xsl:text><xsl:value-of select="DESCRIPCION"/>:</xsl:otherwise>
						</xsl:choose>			
					</xsl:otherwise>
				</xsl:choose>
			</xsl:if>
			<xsl:if test="UF">
				<xsl:param name="valorUF"><xsl:value-of select="UF"/>:</xsl:param> 
				<xsl:apply-templates select="BT"><xsl:with-param name="valor" select="$valorUF"/></xsl:apply-templates>
			</xsl:if>
			<xsl:if test="RT">
				<xsl:param name="valorRT"><xsl:value-of select="RT"/>:</xsl:param> 
				<xsl:apply-templates select="BT"><xsl:with-param name="valor" select="$valorRT"/></xsl:apply-templates>
			</xsl:if>
		</xsl:for-each>
	</xsl:template>   
                   
      <xsl:template match="BT">
              <xsl:param name="valor"/> 
              <xsl:if test="@level =1"><xsl:text>
</xsl:text><separator/><xsl:value-of select="$valor"/>
              </xsl:if>
              <xsl:value-of select="normalize-space(text())"/>
              <xsl:choose><xsl:when test="BT">,<xsl:apply-templates select="BT"/></xsl:when>
              <xsl:otherwise>|</xsl:otherwise></xsl:choose>
      </xsl:template> 
Cada vez se complica mas la cosa jajajaja

Gracias!!

Etiquetas: xml, xsl
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:24.