2017-08-02 4 views
-1

Voici un exemple XMLJe dois passer de XML à HTML. Je dois identifier les éléments qui a une valeur commune et la fusion à une colonne de table unique en HTML

<?xml version='1.0' encoding='UTF-8'?> 
<message> 
<body> 
<asset> 

    <asset-id>test_01</asset-id> 
    <asset-name>report_test</asset-name> 
    <asset-version>1</asset-version> 
    <entity> 
    <id>project_test</id> 
     <entity-record> 
     <id>864d6141-712b-11e7-b775-f9304f8b3051#-</id> 
      <field> 
      <id>name</id> 
      <value>Transport</value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person1</value> 
      </field> 
     </entity-record> 
     <entity-record> 
     <id>864d6141-812b-11e7-b775-f9304f8b3951#-</id> 
      <field> 
      <id>name</id> 
      <value>Transport</value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person2</value> 
      </field> 
     </entity-record> 
     <entity-record> 
     <id>864d6141-712b-11e7-b775-f9314f8b3951#-</id> 
      <field> 
      <id>name</id> 
      <value>Food </value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person3</value> 
      </field> 
     </entity-record> 
     <entity-record> 
     <id>864e6141-712b-11e7-b775-f9304f8b3951#-</id> 
      <field> 
      <id>name</id> 
      <value>Food</value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person4</value> 
      </field> 
     </entity-record> 
     <entity-record> 
      <field> 
      <id>name</id> 
      <value>Food</value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person5</value> 
      </field> 
     </entity-record> 
     <entity-record> 
      <field> 
      <id>name</id> 
      <value>Transport</value> 
      </field> 
      <field> 
      <id>task</id> 
      <value>Person3</value> 
      </field> 
     </entity-record> 
    </entity> 
</asset> 
</body> 
</message> 

Et voici une pauvre tentative i essayé d'utiliser la méthode Muenchian pour les deux premiers cellules.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 
<xsl:key name="fieldbyid" match="field" use="value" /> 
<xsl:template match="message"> 
<html> 
<body> 
<table border="1"> 
    <tr> 
     <td>Project</td> 
     <td>Task</td> 
    </tr> 
    <tr> 
     <xsl:for-each select="body/asset/entity[id[text()='project_test']]/entity-record"> 
     <xsl:sort select="field[id[text()='name']]/value"/> 
     <xsl:for-each select="field[count(./value|key('fieldbyid','value')[1])=1]"> 
     <tr>     
      <td rowspan="{count(key('fieldbyid','value'))}"> 
      <xsl:value-of select="field[id[text()='name']]/value"/> 
      </td> 
      <td><xsl:value-of select="field[id[text()='task']]/value"/></td> 
     </tr> 
     </xsl:for-each> 
     </xsl:for-each> 
    </tr> 
</table> 
</body> 
</html> 
</xsl:template> 
</xsl:stylesheet> 

est ici la sortie je reçois

<html> 
     <body> 
      <table border="1"> 
      <tr> 
       <td>Project</td> 
       <td>Task</td> 
      </tr> 
      <tr> 
       <tr> 
        <td>Food</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person4</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Food</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person5</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Food </td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person3</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Transport</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person1</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Transport</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person2</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Transport</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
       <tr> 
        <td>Person3</td> 
        <td rowspan="0"></td> 
        <td></td> 
       </tr> 
      </tr> 
      </table> 
     </body> 
    </html> 

Voilà comment je veux que ma sortie à regarder, enter image description here enter image description here Le retrait de la seconde boucle, qui maintient le code sur pour loop, <xsl:for-each select="field[count(./value|key('fieldbyid','value')[1])=1]"> il semble qu'il affiche au moins les valeurs. Que signifie cette déclaration? Également sur la valeur pour "." montre à la fois l'identifiant et la valeur, c'est pourquoi j'ai utilisé ./valeur dans ce cas. Toute aide serait géniale! Merci

+0

Je ne comprends pas ce que vous voulez comme la sortie - s'il vous plaît expliquer la logique dans les mots. - Si vous pouvez utiliser XSLT 2.0, pourquoi n'utilisez-vous pas 'xsl: for-each-group' à la place du groupement Muenchian? –

+0

Et je ne vois aucun montant dans votre entrée. –

Répondre

0

Si vous êtes en effet à l'aide d'un processeur XSLT 2.0, essayez ceci comme votre point de départ:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="html" indent="yes"/> 

<xsl:template match="/message"> 
    <html> 
     <body> 
      <table border="1"> 
       <tr> 
        <th>Project</th> 
        <th>Task</th> 
       </tr> 
       <!-- group by name --> 
       <xsl:for-each-group select="body/asset/entity/entity-record" group-by="field[id='name']/value"> 
        <xsl:variable name="tasks"> 
         <!-- group by task --> 
         <xsl:for-each-group select="current-group()" group-by="field[id='task']/value"> 
          <tr> 
           <td> 
            <xsl:value-of select="current-grouping-key()" /> 
           </td> 
          </tr> 
         </xsl:for-each-group>  
        </xsl:variable> 
        <tr> 
         <td rowspan="{1 + count($tasks/tr)}"> 
          <xsl:value-of select="current-grouping-key()" /> 
         </td> 
        </tr> 
        <xsl:copy-of select="$tasks"/> 
       </xsl:for-each-group>    
      </table> 
     </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

La sortie devrait ressembler à ceci:

enter image description here

Ceci est après avoir ajusté votre exemple d'entrée t o supprimer l'espace supplémentaire dans <value>Food </value>.