2017-09-27 11 views
0

J'essaye de représenter avec XSLT une table dont les champs d'entrée peuvent être text ou number. J'ai dans le XML une balise qui contient le nombre de colonnes et de lignes. Dans l'étiquette headerName, j'ai l'information d'en-tête de la table.XSLT quand sinon la boucle ne fonctionne pas correctement

Voici un exemple de mon XML:

<elements> 
     <element type="TABLE"> 
      <id>table2</id> 
      <order>49</order> 
      <table> 
       <colNumber>2</colNumber> 
       <headerName> 
        <amount>false</amount> 
        <value>Header1</value> 
       </headerName> 
       <headerName> 
        <amount>true</amount> 
        <value>Header2</value> 
       </headerName> 
       <rowNumber>2</rowNumber> 
      </table> 
     </element> 
</elements> 

Maintenant, le XSLT que j'utilise est:

<xsl:for-each select="elements/element"> 
    <xsl:if test="@type='TABLE'"> 
     <div data-order="{order}" id="{id}"> 
      <table class="table table-bordered mt-lg"> 
       <thead> 
        <tr> 
         <xsl:for-each select="table/headerName"> 
          <td> 
           <xsl:value-of select="value"/> 
          </td> 
         </xsl:for-each> 
        </tr> 
       </thead> 
       <tbody> 
        <xsl:variable name="rows" select="table/rowNumber/text()"/> 
        <xsl:variable name="cols" select="table/colNumber/text()"/> 
        <xsl:variable name="amount" select="table/headerName/amount/text()"/> 
        <xsl:for-each select="(//node())[$rows &gt;= position()]"> 
         <tr> 
          <xsl:for-each select="(//node())[$cols &gt;= position()]"> 
           <td> 
            <xsl:choose> 
             <xsl:when test="$amount = 'false'"> 
              <input type="text"/> 
             </xsl:when> 
             <xsl:otherwise> 
              <input type="number"/> 
             </xsl:otherwise> 
            </xsl:choose> 
           </td> 
          </xsl:for-each> 
         </tr> 
        </xsl:for-each> 
       </tbody> 
      </table> 
     </div> 
    </xsl:if> 
</xsl:for-each> 

Et mon résultat attendu est la suivante:

<div data-order="49" id="table2"> 
    <table class="table table-bordered mt-lg"> 
     <thead> 
      <tr> 
       <td> 
        Header1 
       </td> 
       <td> 
        Header2 
       </td> 
      </tr> 
     </thead> 
     <tbody> 
      <tr> 
       <td><input type="text"></input></td> 
       <td><input type="number"></input></td> 
      </tr> 
      <tr> 
       <td><input type="text"></input></td> 
       <td><input type="number"></input></td> 
      </tr> 
     </tbody> 
    </table> 
</div> 

Je ne vois pas où est l'erreur, j'ai essayé avec des expressions xpath mais je reçois toujours <input type="text"/>

Répondre

2

Lorsque vous définissez la variable amount vous le faites avant que vos déclarations xsl:for-each, donc il est toujours va être mis à la valeur de la première table/headerName dans le fichier XML Vous avez vraiment besoin de déplacer la déclaration dans la plus intérieure xsl:for-each, comme il semble que vous le voulez en fonction du numéro de colonne actuel. Cependant, vous devrez alors prendre en compte que vous ne serez pas positionné sur l'élément element à ce moment-là, donc vous devrez d'abord enregistrer une référence à element dans une variable, de sorte que vous puissiez y accéder à l'intérieur. le xsl:for-each

ce fragment Essayez XSLT

<tbody> 
    <xsl:variable name="rows" select="table/rowNumber/text()"/> 
    <xsl:variable name="cols" select="table/colNumber/text()"/> 
    <xsl:variable name="node" select="." /> 
    <xsl:for-each select="(//node())[$rows &gt;= position()]"> 
     <tr> 
      <xsl:for-each select="(//node())[$cols &gt;= position()]"> 
       <xsl:variable name="position" select="position()" /> 
       <xsl:variable name="amount" select="$node/table/headerName[position() = $position]/amount/text()"/> 
       <td> 
        <xsl:choose> 
         <xsl:when test="$amount = 'false'"> 
          <input type="text"/> 
         </xsl:when> 
         <xsl:otherwise> 
          <input type="number"/> 
         </xsl:otherwise> 
        </xsl:choose> 
       </td> 
      </xsl:for-each> 
     </tr> 
    </xsl:for-each> 
</tbody> 

Je suppose que vous savez votre XSLT échouera si le rowNumber ou colNumber dépasse le nombre de noeuds dans le XML ....

+0

Votre solution fonctionne parfaitement, merci beaucoup pour l'explication, je ne l'ai pas vu avant. – DMC19