Integración xml-xhtml
2 seguidores
me gustaría saber cómo integrar definiciones en xml con páginas hechas en xhtml. ando un poco despistado del tema, pero pienso que pasaría por poder incluir en el documento xhtml tus propias etiquetas de xml, y para ello habría que ampliar la dtd del xhtml con los módulos que correspondan.
perdón si he dicho alguna barbaridad :P
gracias majos :D
Klein
Exacto, es tal y como dices, pero lo que no entiendo es.... para?
cbp
es que estoy mirando cómo hacer una aplicación que pille los datos de un xml y los plante en un documento xhtml, y se me ha ocurrido que una manera de hacerlo sería esa, aunque ahora que lo pienso podría hacerse con lo de datafld y todo eso ¿no? me parece que soy un poco bodoque y más bruto aún :?
Klein
En ese caso, lo correcto sería tener los contenidos en documentos xml y transformarlos a xhtml vía xslt
cbp
¿y eso cómo se haría exactamente? ¿puedes explicarlo o decirme algún sitio en donde mirarlo en detalle, porfa?
muchas gracias :)
Klein
Para una explicación sencillita te recomiendo que te leas este tutorial:
http://www.w3schools.com/xsl/default.asp
cbp
ok, lo haré.
gracias de nuevo :)
cbp
dioooooooooooooooooooos !!!
me estoy leyendo el tutorial y estoy emocionado, esto es la leche, qué descubrimiento, madre mía, desde "a dos metros bajo tierra" no estaba tan emocionado !!!!
:D :D
cbp
tengo una duda muy grande que me corroe ¿qué es lo mejor para transformar los datos del xml en xhtml?
a) cargar una xsl directamente en el xml
b) hacer la transformación en el cliente con javascript
c) hacer la transformación en el servidor
me gustaría saber qué es lo más correcto sobre todo desde el punto de vista de la accesibilidad.
Klein
La transformación la tienes que hacer siempre en el servidor, así es independiente del parser del cliente (lo del javascript por supuesto, olvídate).
P.D.: Me alegro por la emoción :)
cbp
¿y cómo encaja eso con que mi xml se pueda ver en distintos dispositivos? si envío el xml ya transformado ¿qué hago? ¿incluyo css distintos en el xhtml resultante para cada tipo de dispositivo?
lo de javascript lo tenía casi descartado, me olía muy mal... :D
Klein
El XML nunca tendría que variar ya que son los datos. Lo que tendrías que cambiar según el dispositivo sería el xsl. Primero detectas el usuario que es (navegaodr xhtml, navegador wml, etc ) y luego transformas el xml (que siempre tiene que ser el mismo) con el xsl que corresponda.
Espero haberme explicado
cbp
ya, ya, si el xml no se me había ocurrido variarlo ¿pero cómo detecto el usuario que es si ya he transformado previamente el xml? ¿cómo cargo una xsl u otra en función de quién acceda?
perdón por tanta pregunta, pero es que me interesa mucho el tema :(
Klein
Tienes que detectar al usuario con el HTTP_USER_AGENT antes de haber transformado el xml.
cbp
tooooooooooma ya, tócate los pies que esto se pone serio, tengo miedo... :?
ok, muchas gracias por todo, klein :)
cbp
se me ha ocurrido una cosa ¿qué problema habría en hacerlo así?
1.- un XML con los datos
2.- un XSL en el que se haga una lógica de presentación atendiendo a criterios estructurales del (x)html y en el que se incluyan todas las llamadas a css externas que se consideren necesarias para cubrir el abanico de dispositivos posibles, utilizando el atributo "media" de la etiqueta link.
así se evita tener que hacer la transformación el servidor. la única desventaja que se me ocurre es que si el dispositivo del cliente no tiene un buen parseador no va a funcionar, pero si las especificaciones permiten situar los requisitos en IE6+ y NN7+ podría ser una solución válida ¿no?
Klein
Lo que dices tú es como yo creo que se debería de hacer:
- Tener los datos en XML
- Transformar los datos con XSL en un estricto XHTML y jugar con los CSS/media
Pensé que necesitarías tirar del user_agent para detectar el navegador.
En este caso lo importante es que el XHTML que generes, sea usable y accesible independientemente del dispositivo que se utilice
Por eso muchas veces se tira del user_agent, para mostrar una versión u otra.
cbp
claro claro, estaba pensando en transformarlo con el xsl en un (x)html lo más semántico posible, y luego darle el formato que sea con las css. pero el problema del parseador lo seguiríamos teniendo ¿no?
Klein
¿por qué? No te entiendo
El problema del parser te lo quitas al transformarlo tú en el servidor
cbp
me refiero a que si usamos el método que he dicho antes, con el xml y el xsl con xhtml estricto y diversos css/media, es el cliente el que transforma el xml ya que la llamada se realiza sobre un fichero .xml, por lo que si el parseador del navegador no es bueno, como por ejemplo en el IE 5, no se verá correctamente.
a ver si me estoy haciendo un lío... :?
Klein
El cliente tiene que hacer una llamada a un php, asp o jsp, que será la página encargada de transformar el xml. No haces la llamada al xml directamente. Un ejemplo con ASP:
<code>
<%
'Load XML
set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("paginaXML.xml"))
'Load XSL
set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(Server.MapPath("paginaXSL.xsl"))
'Transform file
Response.Write(xml.transformNode(xsl))
%>
</code>
cbp
pero esa es la transformación en el servidor de la que hablamos antes, lo que no sé es si nos podemos evitar realizar ese paso simplemente llamando a un xml directamente y que sea el navegador el que lo transforme, no con javascript, sino a partir de la xsl a la que llamamos dentro del fichero xml. algo así, vaya:
EL XML
<code>
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="catalogo.xsl"?>
<catalogo>
<cd>
<titulo>Empire Burlesque</titulo>
<artista>Bob Dylan</artista>
<pais>USA</pais>
<companyia>Columbia</companyia>
<precio>10.90</precio>
<anyo>1985</anyo>
</cd>
<cd>
<titulo>Tupelo Honey</titulo>
<artista>Van Morrison</artista>
<pais>UK</pais>
<companyia>Polydor</companyia>
<precio>8.20</precio>
<anyo>1971</anyo>
</cd>
<cd>
<titulo>Soulsville</titulo>
<artista>Jorn Hoel</artista>
<pais>Norway</pais>
<companyia>WEA</companyia>
<precio>7.90</precio>
<anyo>1996</anyo>
</cd>
</catalogo>
</code>
EL XSL
<code>
<?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="/">
<html>
<body>
<h2 style="font-family:Georgia;font-size:13px;color:#606060">Mi colección de CD's</h2>
<table cellpadding="4" cellspacing="1" bgcolor="#d0d0d0" style="font-family:Georgia;font-size:11px;color:#606060">
<tr style="background-color:#9acd32;text-align:center">
<th>Título</th>
<th>Artista</th>
<th>Pais</th>
<th>Compañía</th>
<th>Precio</th>
<th>Año</th>
</tr>
<xsl:for-each select="catalogo/cd[anyo&lt;1997]">
<xsl:sort select="anyo"/>
<tr bgcolor="#ffffff">
<td><xsl:value-of select="titulo"/></td>
<td><xsl:value-of select="artista"/></td>
<td><xsl:value-of select="pais"/></td>
<td><xsl:value-of select="companyia"/></td>
<xsl:choose>
<xsl:when test="precio &gt;= 10">
<td style="color:#cc0000;text-align:right"><xsl:value-of select="precio"/></td>
</xsl:when>
<xsl:otherwise>
<td style="text-align:right"><xsl:value-of select="precio"/></td>
</xsl:otherwise>
</xsl:choose>
<td><xsl:value-of select="anyo"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
</code>
Klein
Me temo que el parseo en el servidor no te lo puedes saltar a no ser que tengas el entorno controladíiiiiisimo (IE y NN)
No te lo recomiendo
cbp
ok, tomo nota.
muchas gracias por todo, hombre :)
cbp
¿el código de arriba para transformar el xml en el servidor sirve para cualquier navegador? lo digo porque usa el Microsoft.XMLDOM, y no sé si funcionará. he probado a hacer la transformación en el cliente con javascript (sólo para probar :P) usando eso mismo y no me va en Mozilla, cosa que por otra parte me parece lógica.
<code>
<script type="text/javascript">
// Load XML
var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.load("catalogo.xml");
// Load XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM");
xsl.async = false;
xsl.load("catalogo.xsl");
// Transform
document.write(xml.transformNode(xsl));
</script>
</code>
¿hay algún equivalente para Mozilla del Microsoft.XMLDOM?
Klein
El código de arriba utiliza el parser del servidor, por eso es independiente del parser del cliente.
Al cliente, la respuesta que le da el servidor es la página ya transformada.