Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: xustyx en 28 Mayo 2013, 00:13 am



Título: Problema al cojer los hijos de un nodo :S (Xpath, XSLT)
Publicado por: xustyx en 28 Mayo 2013, 00:13 am
Buenas a todos pues os comento, llevo rato comiendome la cabeza y no encuentro ninguna solucion que sirva, el problema es el siguiente:

Con C# hago una select que la guardo en un dataset, este dataset lo transformo a xml y luego a este xml le aplico un XSLT.

El problema viene en que por ejemplo si me devuelve dos rows o mas al seleccionar las columnas, en vez de generarlas bien me mete todas en una... un problema del for-each y de que no se como realizar bien la sentencia XPATH puede ser.

Como de antemano no puedo saber las columnas ni el nombre de estas no puedo especificar bien, si no ya lo tendria hecho xD. Weno pa que entendais mejor os paso el codigo.

el XML
Código
  1. <NewDataSet>
  2.      <Table diffgr:id="Table1" msdata:rowOrder="0">
  3.        <CODI>1</CODI>
  4.        <CODIPROVEIDOR>P01</CODIPROVEIDOR>
  5.        <DATA>2012-12-12T00:00:00+01:00</DATA>
  6.        <CODICOMANDA>1</CODICOMANDA>
  7.        <CODIARTICLE>A01</CODIARTICLE>
  8.        <QUANTITAT>12</QUANTITAT>
  9.        <PREU>5</PREU>
  10.        <REBUT>false</REBUT>
  11.      </Table>
  12.      <Table diffgr:id="Table2" msdata:rowOrder="1">
  13.        <CODI>3</CODI>
  14.        <CODIPROVEIDOR>P01</CODIPROVEIDOR>
  15.        <DATA>2013-05-27T00:00:00+02:00</DATA>
  16.        <CODICOMANDA>3</CODICOMANDA>
  17.        <CODIARTICLE>A02</CODIARTICLE>
  18.        <QUANTITAT>10</QUANTITAT>
  19.        <PREU>5</PREU>
  20.        <REBUT>false</REBUT>
  21.      </Table>
  22.    </NewDataSet>
  23.  

Como podeis ver existenten dos rows las dos table, que se muestran, i cada table tiene 8 columnas, bueno al pasarle el XLST el resultado es que me mete por cada row 16 columnas, ja que no se como especificar en el for-each por cada hijo de table (thiiiiiiiis) no por cada hijo de todos los nodo tables que es lo que me hace.

Aqui el XSLT
Código
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  3. <xsl:template match="/">
  4.  <html>
  5.  <body>
  6.   <xsl:choose>
  7.  <xsl:when test="not(//NewDataSet)">
  8.  <h1><center>El proveidor no existeix o no te cap comanda.</center></h1>
  9.  </xsl:when>
  10.  <xsl:otherwise>
  11. <h1><center>Llistat d'articles pendents del proveidor: <xsl:value-of select="//NewDataSet/Table/CODIPROVEIDOR/." /></center></h1>
  12. <table>
  13. <tr>
  14. <xsl:for-each select="//NewDataSet/Table[@* = 'Table1']/*" >
  15. <th><xsl:value-of select="name(.)" /></th>
  16. </xsl:for-each>
  17. </tr>
  18. <xsl:for-each select="//NewDataSet/Table">
  19. <tr>
  20. <xsl:for-each select="//NewDataSet/Table/*">
  21. <td><xsl:value-of select="." /></td>
  22. </xsl:for-each>
  23. </tr>
  24. </xsl:for-each>
  25. </table>
  26.  </xsl:otherwise>
  27. </xsl:choose>
  28.  </body>
  29.  </html>
  30. </xsl:template>
  31. </xsl:stylesheet>
  32.  

Bueno aun ni he posteado pero le dao un ultimo intento a mi imaginacion y a resultado efectivo  (La heiniken ma echo pensar en verde XDDDD).

Este es el XSLT que he usado y a rulado.

Código
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  3. <xsl:template match="/">
  4.  <html>
  5.  <body>
  6.   <xsl:choose>
  7.  <xsl:when test="not(//NewDataSet)">
  8.  <h1><center>El proveidor no existeix o no te cap comanda.</center></h1>
  9.  </xsl:when>
  10.  <xsl:otherwise>
  11. <h1><center>Llistat d'articles pendents del proveidor: <xsl:value-of select="//NewDataSet/Table/CODIPROVEIDOR/." /></center></h1>
  12. <table>
  13. <tr>
  14. <xsl:for-each select="//NewDataSet/Table[@* = 'Table1']/*" >
  15. <th><xsl:value-of select="name(.)" /></th>
  16. </xsl:for-each>
  17. </tr>
  18. <xsl:for-each select="//NewDataSet/Table">
  19. <tr>
  20. <xsl:for-each select="child::*">
  21. <td><xsl:value-of select="." /></td>
  22. </xsl:for-each>
  23. </tr>
  24. </xsl:for-each>
  25. </table>
  26.  </xsl:otherwise>
  27. </xsl:choose>
  28.  </body>
  29.  </html>
  30. </xsl:template>
  31. </xsl:stylesheet>
  32.  

Bueno excepto el titulo del principio lo que en realidad queria era conseguir mediante un xslt un metodo general para poder pasar a html (tabla) todas las selects que metiese en un dataset.

Saludos :)