Foros del Web » Programación para mayores de 30 ;) » Programación General »

Crear formulario desde XML usando XSLT

Estas en el tema de Crear formulario desde XML usando XSLT en el foro de Programación General en Foros del Web. <xsl:value-of select="./ListaD/nombre"/>: <select> <xsl:attribute name="name"><xsl:value-of select="./ListaD/name"/></xsl:attribute> <xsl:for-each select="form/cont/ListaD/value"> <option> <xsl:attribute name="value"><xsl:value-of select="./ListaD/value"/></xsl:attribute><xsl:value-of select="./ListaD/value"/> </option> </xsl:for-each> </select> El anterior código en XSLT es para modificar un ...
  #1 (permalink)  
Antiguo 09/06/2005, 09:39
 
Fecha de Ingreso: mayo-2005
Ubicación: España
Mensajes: 279
Antigüedad: 19 años
Puntos: 2
Exclamación Crear formulario desde XML usando XSLT

<xsl:value-of select="./ListaD/nombre"/>:

<select>
<xsl:attribute name="name"><xsl:value-of select="./ListaD/name"/></xsl:attribute>
<xsl:for-each select="form/cont/ListaD/value">
<option>
<xsl:attribute name="value"><xsl:value-of select="./ListaD/value"/></xsl:attribute><xsl:value-of select="./ListaD/value"/>
</option>
</xsl:for-each>
</select>

El anterior código en XSLT es para modificar un XML de la forma :
<ListaD>
<nombre>...</nombre>
<name>...</name>
<value>...</value>
<value>...</value>
...
<value>...</value>
</ListaD>

Deseo modificar el XML y crear el HTML que contenga un control de tipo Lista desplegable con las características que indico.
Por favor no logro realizarlo, gracias.
  #2 (permalink)  
Antiguo 10/06/2005, 10:32
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
La estructura XML que has escogido no parece del todo intuitiva para lo que quieres representar.

Se puede modificar o tiene que seresa estructura XML forzosamente?

Yo propondría una estructura de esta forma:

<ListaD>
<nombre>...</nombre>
<elem>
<name>...</name>
<value>...</value>
</elem>
<elem>
<name></name>
<value>...</value>
</elem>
...
</ListaD>

Como ves, he agrupado los pares <name><value> en elementos <elem>. Por cada <elem> se generaría el equivalente html a <option>.

Es eso lo que quieres?
__________________
BUSCO TELETRABAJO
Experiencia de mas de 4 años como desarrolladora web en PHP, ASP, XML, XSL, JavaScript, MySQL, PostGres, SQLServer, ...
  #3 (permalink)  
Antiguo 12/06/2005, 09:20
 
Fecha de Ingreso: mayo-2005
Ubicación: España
Mensajes: 279
Antigüedad: 19 años
Puntos: 2
Tampoco logro solucionarlo así...me aparece el nombre pero no me aparecen los elementos!!!

<xsl:for-each select="./Checkbox/element">
<input type="checkbox">
<xsl:attribute name="name"><xsl:value-of select="./Checkbox/element/name"/></xsl:attribute>

<xsl:attribute name="value"><xsl:value-of select="./Checkbox/element/value"/></xsl:attribute>
</input>
</xsl:for-each>
  #4 (permalink)  
Antiguo 12/06/2005, 09:21
 
Fecha de Ingreso: mayo-2005
Ubicación: España
Mensajes: 279
Antigüedad: 19 años
Puntos: 2
Y me ocurre lo mismo con los checkbox, lista desplegable y radio(en los q puede haber varios valores)
  #5 (permalink)  
Antiguo 13/06/2005, 02:03
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
A ver... ese codigo que has puesto no tiene nada que ver con el XML...
Por que no haces una cosa? Pon un ejemplo de XML que realmente estás usando y tu código XSL que lo recorre. Seguramente estás indicando mal las rutas XPath en tu XSL.

Besos
__________________
BUSCO TELETRABAJO
Experiencia de mas de 4 años como desarrolladora web en PHP, ASP, XML, XSL, JavaScript, MySQL, PostGres, SQLServer, ...
  #6 (permalink)  
Antiguo 13/06/2005, 04:15
 
Fecha de Ingreso: mayo-2005
Ubicación: España
Mensajes: 279
Antigüedad: 19 años
Puntos: 2
CÓDIGO XSLT
<xsl:for-each select="./Checkbox/elemento">
<td>
<input type="checkbox">
<xsl:attribute name="name"><xsl:value-of select="./Checkbox/elemento/name"/></xsl:attribute>
<xsl:attribute name="value"><xsl:value-of select="./Checkbox/elemento/value"/></xsl:attribute>
</input>
</td>
<td>
<xsl:value-of select="./Checkbox/elemento/value"/>
</td>
ACTÚA SOBRE EL XML
<Checkbox>
<nombre>Checkbox3</nombre>
<elemento>
<name>check</name>
<value>opcion uno</value>
</elemento>
<elemento>
<name>check</name>
<value>opcion dos</value>
</elemento>
<elemento>
<name>check</name>
<value>opcion tres</value>
</elemento>
</Checkbox>

Cuando intento ver el resultado me aparecen las casillas del checkbox dibujadas las puedo tickar, pero no me aparece la descripcion de cada una a vista del usuario, que es lo que intento hacer con la línea marcada con el icono.
el mismo problema tengo con las listas desplegables y los botones radio, a vista del usuario no hay descipción.
También, si tengo varias listas o varios radios me los agrupa todos en uno aunq tengan nombres diferentes.
Todos los controles estan agrupados entre las etiquetas <control>...</control> y comprubo que control es con <xsl:if test="Checkbox">

Gracias, estoy muy perdida.
Gracias.
  #7 (permalink)  
Antiguo 13/06/2005, 04:53
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Hola!

A ver... exactamente no se que le pasaba a tu codigo pero el utilizar las rutas XPath de la forma ./Checkbox/elemento/name no es la mas apropiada.. y como tu código no era completo no he podido generarte un codigo acorde a ese tipo de rutas.

Te he reconstruido tu XSL con templates para que no dependan las rutas XPATH del nodo en el que te encuentres y el codigo es mas claro haciendolo de esta forma (al menos para mi). Lo he probado y funciona perfectamente.

Código:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
	<html>
	<body>
	<table border="0">
		<xsl:apply-templates select="Checkbox" />
	</table>
	</body>
	</html>
</xsl:template>

<xsl:template match="Checkbox">
	<xsl:apply-templates select="elemento" />
</xsl:template>

<xsl:template match="elemento">
	<tr>
		<td>
			<input type="checkbox">
			    <xsl:attribute name="name"><xsl:value-of select="name"/></xsl:attribute>
			    <xsl:attribute name="value"><xsl:value-of select="value"/></xsl:attribute>
			</input>
		</td>
		<td>
			<xsl:value-of select="value"/>
		</td>
	</tr>
</xsl:template>
</xsl:stylesheet>
Suerte!
__________________
BUSCO TELETRABAJO
Experiencia de mas de 4 años como desarrolladora web en PHP, ASP, XML, XSL, JavaScript, MySQL, PostGres, SQLServer, ...
  #8 (permalink)  
Antiguo 13/06/2005, 05:11
 
Fecha de Ingreso: mayo-2005
Ubicación: España
Mensajes: 279
Antigüedad: 19 años
Puntos: 2
Al tener varios controles el apply templates debo redirigirlo a todos?

El código completo es:

<?xsl version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">

<html>
<head>
<title><xsl:value-of select="formulario/titulo"/></title>
</head>

<body>
<h3><xsl:value-of select="formulario/comentarios"/></h3>
<form>
<xsl:attribute name="action">procesar.jsp?idForm=<xsl:value-of select="formulario/id"/></xsl:attribute>
</form>

<link>
<xsl:attribute name="href"><xsl:value-of select="formulario/formato"/></xsl:attribute>
</link>

<xsl:for-each select="formulario/controles">

<xsl:if test="LineaTexto">
<p>
<tr>

<td align="center"> <xsl:value-of select="./LineaTexto/nombre"/>: </td>

<td align="center">
<input type="text" >
<xsl:attribute name="name"><xsl:value-of select="./LineaTexto/name"/></xsl:attribute>
<xsl:attribute name="size"><xsl:value-of select="./LineaTexto/size"/></xsl:attribute>
<xsl:attribute name="maxlength"><xsl:value-of select="./LineaTexto/maxlength"/></xsl:attribute>
</input>
</td>

</tr>
</p>
</xsl:if>
<xsl:if test="AreaTexto">
<p>
<tr>
<td> <xsl:value-of select="./AreaTexto/nombre" />: </td>
<td align="center">
<textarea>
<xsl:attribute name="name"><xsl:value-of select="./AreaTexto/name"/></xsl:attribute>
<xsl:attribute name="rows"><xsl:value-of select="./AreaTexto/rows"/></xsl:attribute>
<xsl:attribute name="cols"><xsl:value-of select="./AreaTexto/cols"/></xsl:attribute>
<xsl:value-of select="./AreaTexto/textoDefecto" />
</textarea>
</td>

</tr>
</p>
</xsl:if>

<xsl:if test="Checkbox">
<p>
<tr>
<td> <xsl:value-of select="./Checkbox/nombre"/>: </td>
<td>
<xsl:for-each select="./Checkbox/elemento">
<tr>
<td>
<input type="checkbox">
<xsl:attribute name="name"><xsl:value-of select="./Checkbox/elemento/name"/></xsl:attribute>
<xsl:attribute name="value"><xsl:value-of select="./Checkbox/elemento/value"/></xsl:attribute>
</input>
</td>
<td>
<xsl:value-of select="./Checkbox/elemento/value"/>
</td>
</tr>
</xsl:for-each>
</td>

</tr>
</p>
</xsl:if>

<xsl:if test="Password">
<p>
<tr>

<td> <xsl:value-of select="./Password/nombre"/>: </td>
<td>
<input type="password">
<xsl:attribute name="name"><xsl:value-of select="./Password/name"/></xsl:attribute>
<xsl:attribute name="size"><xsl:value-of select="./Password/size"/></xsl:attribute>
<xsl:attribute name="maxlength"><xsl:value-of select="./Password/maxlength"/></xsl:attribute>
</input>
</td>

</tr>
</p>
</xsl:if>

<xsl:if test="ListaDesplegable">
<p>
<tr>
<td> <xsl:value-of select="./ListaDesplegable/nombre"/>: </td>
<td>
<select>
<xsl:attribute name="name"><xsl:value-of select="./ListaDesplegable/name"/></xsl:attribute>
<xsl:for-each select="./ListaDesplegable/elemento">
<option>
<xsl:attribute name="value"><xsl:value-of select="./ListaDesplegable/elemento/value"/></xsl:attribute><xsl:value-of select="./ListaDesplegable/elemento/valueus"/>
</option>
</xsl:for-each>
</select>
</td>
</tr>
</p>
</xsl:if>

<xsl:if test="Radio">
<p>
<tr>
<td> <xsl:value-of select="./Radio/nombre"/>: </td>

<td>
<xsl:for-each select="./Radio/value">
<input type="radio">
<xsl:attribute name="name"><xsl:value-of select="./Radio/name"/></xsl:attribute>

<xsl:attribute name="value"><xsl:value-of select="./Radio/value"/></xsl:attribute>
</input>
</xsl:for-each>
</td>

</tr>
</p>
</xsl:if>

<xsl:if test="Submit">
<p>
<tr>

<td>
<input type="submit">
<xsl:attribute name="value"><xsl:value-of select="./Submit/nombre"/></xsl:attribute>
<xsl:attribute name="action"><xsl:value-of select="./Submit/action"/></xsl:attribute>
</input>
</td>

</tr>
</p>
</xsl:if>

</xsl:for-each>

</body>

</html>

</xsl:template>

</xsl:stylesheet>
  #9 (permalink)  
Antiguo 13/06/2005, 05:47
 
Fecha de Ingreso: mayo-2005
Ubicación: España
Mensajes: 279
Antigüedad: 19 años
Puntos: 2
Y mi XML es de la forma:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet href="Formularios.xsl" type="text/xsl" ?>
<formulario>
<titulo>Formulario numero tres</titulo>
<comentarios>Formulario de prueba</comentarios>
<formato>Opcion1.css</formato>
<id>2</id>
<controles>
<ListaDesplegable>
<nombre>Lista1</nombre>
<name>lista</name>
<elemento>
<value>Uno</value>
<valueus>Uno</valueus>
</elemento>
<elemento>
<value>Dos</value>
<valueus>Dos</valueus>
</elemento>
<elemento>
<value>Tres</value>
<valueus>Tres</valueus>
</elemento>
<elemento>
<value>Cuatro</value>
<valueus>Cuatro</valueus>
</elemento>
</ListaDesplegable>
<Checkbox>
<nombre>Checkbox3</nombre>
<elemento>
<name>check</name>
<value>opc1</value>
</elemento>
<elemento>
<name>check</name>
<value>opc2</value>
</elemento>
<elemento>
<name>check</name>
<value>opc3</value>
</elemento>
</Checkbox>
<ListaDesplegable>
<nombre>Lista2</nombre>
<name>listad</name>
<elemento>
<value>positivo</value>
<valueus>positivo</valueus>
</elemento>
<elemento>
<value>negativo</value>
<valueus>negativo</valueus> //valueus: valor a la viste del usuario
</elemento>
</ListaDesplegable>
<LineaTexto>
<nombre>Linea1</nombre>
<name>linea</name>
<size>10</size>
<maxlength>10</maxlength>
</LineaTexto>
<Reset>
<nombre>Borrar</nombre>
<name>borrar</name>
</Reset>
</controles>
</formulario>
  #10 (permalink)  
Antiguo 13/06/2005, 05:59
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Ya vi donde tienes el error...

Cuando pones <xsl:for-each select="./Checkbox/elemento"> el nodo en el que te encuentras no es el raíz sino elemento. Por tanto, cuando quiereas sacar el valor de las etiqeutas name y value debes poner: <xsl:value-of select="name/text()" /> y <xsl:value-of select="value/text()" />

Es eso lo que estaba mal.

Besos
__________________
BUSCO TELETRABAJO
Experiencia de mas de 4 años como desarrolladora web en PHP, ASP, XML, XSL, JavaScript, MySQL, PostGres, SQLServer, ...
  #11 (permalink)  
Antiguo 13/06/2005, 06:14
 
Fecha de Ingreso: mayo-2005
Ubicación: España
Mensajes: 279
Antigüedad: 19 años
Puntos: 2
Muchísimas gracias Helbira. Era un tema que me traía loca.

Mil gracias.

Besos,

Carla
  #12 (permalink)  
Antiguo 13/06/2005, 08:51
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
De ná, niña!

Besos
__________________
BUSCO TELETRABAJO
Experiencia de mas de 4 años como desarrolladora web en PHP, ASP, XML, XSL, JavaScript, MySQL, PostGres, SQLServer, ...
  #13 (permalink)  
Antiguo 15/06/2005, 04:15
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Ahí llevas el código de tu XSL. Tienes arreglado el tema que no te agrupe cada tipo de control del formualrio sino que te aparezcan en el orden en que vienen en el XML. Creo que es eso lño que querias.

Código:
<?xml version="1.0" encoding="iso-8859-1"?>
<?xsl version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="/">
<html>
	<head><title><xsl:value-of select="formulario/titulo/text()"/></title></head>

	<body>
		<h3><xsl:value-of select="formulario/comentarios/text()"/></h3>
		<form>
		 <xsl:attribute name="action">procesar.jsp?idForm=<xsl:value-of select="formulario/id/text()"/></xsl:attribute>
		</form>

		<link>
		 <xsl:attribute name="href"><xsl:value-of select="formulario/formato/text()"/></xsl:attribute>
		</link>
		
		<xsl:apply-templates select="formulario/controles" />
</body>
</html>
</xsl:template>

<xsl:template match="controles">
	<xsl:apply-templates select="child::*" />
</xsl:template>

<xsl:template match="LineaTexto">
				<p>
					<tr>
					 <td align="center"> <xsl:value-of select="nombre/text()"/>: </td>
					 <td align="center">
						 <input type="text" >
							 <xsl:attribute name="name"><xsl:value-of select="name/text()"/></xsl:attribute>
							 <xsl:attribute name="size"><xsl:value-of select="size/text()"/></xsl:attribute>
							 <xsl:attribute name="maxlength"><xsl:value-of select="maxlength/text()"/></xsl:attribute>
						 </input>
					 </td>
				</tr>
			</p>

</xsl:template>
<xsl:template match="AreaTexto">
			<p>
				<tr>
				 <td> <xsl:value-of select="AreaTexto/nombre" />: </td>
				    <td align="center">
					 <textarea>
						 <xsl:attribute name="name"><xsl:value-of select="name"/></xsl:attribute>
						 <xsl:attribute name="rows"><xsl:value-of select="rows"/></xsl:attribute>
						 <xsl:attribute name="cols"><xsl:value-of select="cols"/></xsl:attribute>
						 <xsl:value-of select="textoDefecto" />
					 </textarea>
					</td>
				</tr>
			</p>

</xsl:template>

<xsl:template match="Checkbox">
			<p>
					<tr>
				 <td> <xsl:value-of select="nombre"/>: </td>
					<td>
					 <xsl:for-each select="elemento">
						 <tr>
							 <td>
								 <input type="checkbox">
									 <xsl:attribute name="name"><xsl:value-of select="name/text()"/></xsl:attribute>
									 <xsl:attribute name="value"><xsl:value-of select="value/text()"/></xsl:attribute>
								 </input>
							 </td>
							 <td><xsl:value-of select="value/text()"/></td>
						 </tr>
					 </xsl:for-each>
				   </td>
				</tr>
			</p>

</xsl:template>

<xsl:template match="Password">
			<p>
				<tr>
			 <td> <xsl:value-of select="nombre"/>: </td>
				<td>
				 <input type="password">
					 <xsl:attribute name="name"><xsl:value-of select="name"/></xsl:attribute>
					 <xsl:attribute name="size"><xsl:value-of select="size"/></xsl:attribute>
					 <xsl:attribute name="maxlength"><xsl:value-of select="maxlength"/></xsl:attribute>
				    </input>
				</td>
			</tr>
		</p>

</xsl:template>

<xsl:template match="ListaDesplegable">
<p>
<tr>
<td> <xsl:value-of select="nombre"/>: </td>
<td>
<select>
<xsl:attribute name="name"><xsl:value-of select="name"/></xsl:attribute>
<xsl:for-each select="elemento">
<option>
<xsl:attribute name="value"><xsl:value-of select="value"/></xsl:attribute><xsl:value-of select="value"/>
</option>
</xsl:for-each>
</select>
</td>
</tr>
</p>

</xsl:template>

<xsl:template match="Radio">
<p>
<tr>
<td> <xsl:value-of select="nombre"/>: </td>

<td>
<xsl:for-each select="value">
<input type="radio">
<xsl:attribute name="name"><xsl:value-of select="name"/></xsl:attribute>

<xsl:attribute name="value"><xsl:value-of select="value"/></xsl:attribute>
</input>
</xsl:for-each>
</td>

</tr>
</p>

</xsl:template>

<xsl:template match="Submit">
<p>
<tr>

<td>
<input type="submit">
<xsl:attribute name="value"><xsl:value-of select="nombre"/></xsl:attribute>
<xsl:attribute name="action"><xsl:value-of select="action"/></xsl:attribute>
</input>
</td>

</tr>
</p>

</xsl:template>

<xsl:template match="Reset">
<p>
<tr>

<td>
<input type="reset">
<xsl:attribute name="value"><xsl:value-of select="nombre"/></xsl:attribute>
<xsl:attribute name="value"><xsl:value-of select="name"/></xsl:attribute>
</input>
</td>

</tr>
</p>
</xsl:template>
</xsl:stylesheet>
Besos
__________________
BUSCO TELETRABAJO
Experiencia de mas de 4 años como desarrolladora web en PHP, ASP, XML, XSL, JavaScript, MySQL, PostGres, SQLServer, ...
  #14 (permalink)  
Antiguo 15/06/2005, 08:51
 
Fecha de Ingreso: mayo-2005
Ubicación: España
Mensajes: 279
Antigüedad: 19 años
Puntos: 2
Gracias, ya me lo muestra bien. Aún así no funcionan los botones, ni aplica la plantilla CSS.

Un beso
  #15 (permalink)  
Antiguo 15/06/2005, 09:08
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
A ver que código HTML estás generando para los botones y la plantilla CSS... Tendrás algo mal.
__________________
BUSCO TELETRABAJO
Experiencia de mas de 4 años como desarrolladora web en PHP, ASP, XML, XSL, JavaScript, MySQL, PostGres, SQLServer, ...
  #16 (permalink)  
Antiguo 16/06/2005, 02:39
 
Fecha de Ingreso: mayo-2005
Ubicación: España
Mensajes: 279
Antigüedad: 19 años
Puntos: 2
En el parámetro action del jsp quiero que pase a la página Procesar y le pase el valor idForm(incluido en la qtiqueta id del xml):

<form>
<xsl:attribute name="action">Procesar.jsp?idForm=<xsl:value-of select="formulario/id/text()"/></xsl:attribute>
</form>

me pasa a dicha página pero en ella intento acceder a idForm y no lo reconoce.

Gracias.
  #17 (permalink)  
Antiguo 16/06/2005, 02:46
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
Pasa el idForm en vez de por Request en la URL hazlo desde un <input type="hidden"> y usa el atributo method del formulario como tipo POST en vez de GET

BEsos
__________________
BUSCO TELETRABAJO
Experiencia de mas de 4 años como desarrolladora web en PHP, ASP, XML, XSL, JavaScript, MySQL, PostGres, SQLServer, ...
  #18 (permalink)  
Antiguo 26/09/2005, 17:54
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
un saludo y muchas gracias!!

me ha sido de utilidad la info posteada....


:)
  #19 (permalink)  
Antiguo 14/10/2005, 09:35
Avatar de Helbira  
Fecha de Ingreso: octubre-2001
Ubicación: Sevilla, España
Mensajes: 1.228
Antigüedad: 22 años, 6 meses
Puntos: 5
;P
Menos mal!... le dediqué mi tiempo.
__________________
BUSCO TELETRABAJO
Experiencia de mas de 4 años como desarrolladora web en PHP, ASP, XML, XSL, JavaScript, MySQL, PostGres, SQLServer, ...
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 12:49.