Longue liste avec attributs identiques

Longue liste avec attributs identiques - XML/XSL - Programmation

Marsh Posté le 21-09-2006 à 15:33:31    

Bonjour,
Dans le cadre de mon projet de CMS je me trouve confronté à un problème potentiel de performances.
Quand je sors un listing de la base de donnée, celui-ci est transformé en flux XML puis transformé en xHtml à l'aide d'une feuille xsl.
Le problème est le suivant, des fois je dois sortir un long listing (par rapport les accès au site) qui est, actuellement, sous la forme :

Code :
  1. <element>
  2. <id>
  3.   <readonly>1</readonly>
  4.   <value>1</value>
  5. </id>
  6. <time>
  7.   <readonly>1</readonly>
  8.   <value>17:01</value>
  9. </time>
  10. <important>
  11.   <readonly>0</readonly>
  12.   <value>1</value>
  13. </important>
  14. </element>


Et ceci se repète X fois, 1 fois pour chaque ligne retournée par la base de donnée.
Le problème est que toutes les lignes auront certains attributs identiques (dans ce cas, tous les id seront readonly, idem pour les time, et tous les "important" seront non-readonly). Ducoup dans la structure actuelle je me trimbale avec beaucoup de données pour rien, ce qui me coute du temps et des performances.
 
J'ai pensé à faire une sorte de "cartouche" donnant les informations particulières à chaque item, mais ça me semble assez compliqué à parser après. Sinon j'avais pensé à rassembler toutes les données dans une meme structure , genre :

Code :
  1. <id>
  2. <readonly>1</readonly>
  3. <value>1</value>
  4. <value>2</value>
  5. ..
  6. </id>


Mais ça me semble super sale, et je me vois déjà les problèmes de tri au cas ou PHP ferait une faute en inscrivant les données :/.
 
Comment voyez vous la situation ?  
 
Merci beaucoup  :bounce:

Reply

Marsh Posté le 21-09-2006 à 15:33:31   

Reply

Marsh Posté le 21-09-2006 à 15:52:02    

j'utiliserais plutôt le format des dataset de .NET (pour les web service par exemple)
 
à savoir :
 
une section de déclaration, qui marche comme une xsd (liste des champs, avec informations de taille, type, etc. où tu peux mettre ton "readonly" ) puis une section de données, où tu listes toutes les lignes avec uniquement les valeurs des champs.
 
exemple :
 


<result>
  <definition>
    <field name="id" readonly="1"/>
    <field name="time" readonly="1"/>
    <field name="important" readonly="0"/>
  </definition>
  <data>
    <element>
      <id>1</id>
      <time>17:01</time>
      <important>1</important>
    </element>
    [...]
  </data>
</result>


Message édité par MagicBuzz le 21-09-2006 à 15:52:41
Reply

Marsh Posté le 21-09-2006 à 15:54:54    

Oui c'est ce que je faisais quand je parlais de "cartouche". Je vais ecouter ce que les autres ont à dire mais je pense que je vais faire comme ça


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 21-09-2006 à 16:31:53    

Ern gros, mon truc, après prise de tête (y'a pas un truc qui permet de parcourir tous les éléments d'une node afin de retrouver leur nom ?)
 
Donc :
 
xsl :

Code :
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
  3. <!-- Le msxsl c'est pour récupérer la node dans la variable, car chaque parseur XSL à son truc proprio, c'est mega pratique... ici, l'implémentation de Microsoft -->
  4.   <xsl:template match="/" xmlns="http://www.w3.org/1999/xhtml">
  5.     <html>
  6.       <head>
  7.         <title>Test</title>
  8.       </head>
  9.       <body>
  10.         <xsl:apply-templates select="/result"/>
  11.       </body>
  12.     </html>
  13.   </xsl:template>
  14.   <xsl:template match="result" xmlns="http://www.w3.org/1999/xhtml">
  15.     <table border="1">
  16.       <tr>
  17.         <th>-</th>
  18.         <xsl:for-each select="definition/field">
  19.           <th>
  20.             <xsl:value-of select="@name"/>
  21.           </th>
  22.         </xsl:for-each>
  23.       </tr>
  24.       <xsl:for-each select="data/element">
  25.         <xsl:variable name="currentElement"><xsl:copy-of select="."/></xsl:variable>
  26.         <tr>
  27.           <th><xsl:value-of select="position()"/></th>
  28.           <xsl:for-each select="../../definition/field">
  29.             <xsl:variable name="name"><xsl:value-of select="@name"/></xsl:variable>
  30.             <td>
  31.               <xsl:choose>
  32.                 <xsl:when test="@readonly = 1">
  33.                   <xsl:value-of select="msxsl:node-set($currentElement)/element/field[@name = $name]"/>
  34.                 </xsl:when>
  35.                 <xsl:otherwise>
  36.                   <input type="value">
  37.                     <xsl:attribute name="value"><xsl:value-of select="msxsl:node-set($currentElement)/element/field[@name = $name]"/></xsl:attribute>
  38.                   </input>
  39.                 </xsl:otherwise>
  40.               </xsl:choose>
  41.             </td>
  42.           </xsl:for-each>
  43.         </tr>
  44.       </xsl:for-each>
  45.     </table>
  46.   </xsl:template>
  47. </xsl:stylesheet>


 
xml

Code :
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <?xml-stylesheet type="text/xsl" href="toto.xsl"?>
  3. <result>
  4.   <definition>
  5.     <field name="id" readonly="1"/>
  6.     <field name="time" readonly="1"/>
  7.     <field name="important" readonly="0"/>
  8.   </definition>
  9.   <data>
  10.     <element>
  11.       <field name="id">1</field>
  12.       <field name="time">17:01</field>
  13.       <field name="important">1</field>
  14.     </element>
  15.     <element>
  16.       <field name="id">3</field>
  17.       <field name="time">18:29</field>
  18.       <field name="important">Truc muche</field>
  19.     </element>
  20.   </data>
  21. </result>


 
chez moi ça marche sous ie
 
y'a juste le coup du "msxsl:node-set()" qui est chiant car il faut trouver l'équivalent pour ton parseur, c'est du XSL2, et chaque parseur a implémenté node-set() avec son propre namespace, c'est hyper pratique.

Reply

Marsh Posté le 21-09-2006 à 16:33:59    

ps: tu noteras par contre que si c'est juste pour stocker "readonly" tu gagne rien. j'espère pour toi que t'as plus d'infos redondantes ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed