2017-10-10 13 views
0

J'ai le problème suivant (qui est assez souvent discuté sur ce domaine mais je n'arrive toujours pas à obtenir la solution exacte): J'ai un XML comme suit:XSLT - Comment boucler sur des nœuds répétitifs/dupliqués XML et obtenir la première occurrence

<?xml version="1.0" encoding="UTF-8"?> 
<S001_subs_block> 
    <BS0900_summary_block> 
     <BS09001> 
     <details> 
      <descr_en>Services Monthly Fee</descr_en> 
      <Amt>10.00</Amt> 
     </details> 
     <details> 
      <descr_en>Calls</descr_en> 
      <Amt>5.00</Amt> 
     </details> 
     <details> 
      <descr_en>*International Roaming</descr_en> 
      <Amt>7.00</Amt> 
     </details> 
     </BS09001> 
</S001_subs_block> 
<S001_subs_block> 
    <BS0900_summary_block> 
     <BS09001> 
     <details> 
      <descr_en>Services Monthly Fee</descr_en> 
      <Amt>8.00</Amt> 
     </details> 
     <details> 
      <descr_en>Calls</descr_en> 
      <Amt>9.00</Amt> 
     </details> 
     <details> 
      <descr_en>*International Roaming</descr_en> 
      <Amt>14.00</Amt> 
     </details> 
     </BS09001> 
</S001_subs_block> 

ce que je dois est de montrer la sortie HTML uniquement pour les premiers enfants du cycle répété des valeurs et le mettre dans une table. Ma tentative XSLT était:

<table class="zui-table zui-table-rounded"> 
     <tr> 
      <th>Subscriber Invoice Summary</th> 
     </tr> 

     <xsl:for-each select="//BS09001/details"> 
     <xsl:if test="position()=1"> 
     <tr> 
      <td><xsl:value-of select="descr_en"/></td> 
      <td><xsl:value-of select="Amt"/></td> 
     </tr> 
     </xsl:if> 
     </xsl:for-each> 

     <xsl:for-each select="//BS09002/details"> 
     <xsl:if test="position()=1"> 
     <tr> 
      <td><xsl:value-of select="descr_en"/></td> 
      <td><xsl:value-of select="Amt"/></td> 
     </tr> 
     </xsl:if> 
     </xsl:for-each> 

     </table> 

Ce ne fonctionne pas, je veux la table HTML pour afficher uniquement la première occurrence de valeurs, qui est la suivante:

<table class="zui-table zui-table-rounded"> 
<tr> 
<th>Account Invoice Summary</th> 
</tr> 
<tr> 
<td>Services Monthly Fee</td><td>10.00</td> 
</tr> 
<tr> 
<td>Calls</td><td>5.00</td> 
</tr> 
<tr> 
<td>*International Roaming</td><td>14.00</td> 
</tr> 
</table> 

Maintenant, je ne ai pas besoin du HTML Code, j'ai besoin du XSLT pour sélectionner seulement les premières valeurs de cycles répétés et dans le cas où la possibilité de passer en revue plusieurs cycles répétés ayant le contrôle du nombre d'itération. J'espère que j'ai été clair :-(

+0

Utilisez '' pour obtenir les détails de la première entrée et supprimer le 'xsl: if' –

Répondre

0

Je pense que je reçois ce que vous cherchez Une recherche rapide sur cette réponse SO (https://stackoverflow.com/a/15693824) qui utilise Muenchian Grouping pour faire ce que (je crois) que vous voulez. fins, il ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:key name="details" match="//BS0900_summary_block/*" use="local-name()" /> 

<xsl:template match="/"> 
    <table class="zui-table zui-table-rounded"> 
     <tr> 
      <th>Account Invoice Summary</th> 
     </tr> 

     <xsl:apply-templates select="//BS0900_summary_block/*[generate-id() = generate-id(key('details', local-name())[1])]/details" /> 
    </table> 
</xsl:template> 

<xsl:template match="details"> 
    <tr> 
     <td><xsl:value-of select="descr_en"/></td> 
     <td><xsl:value-of select="Amt"/></td> 
    </tr> 
</xsl:template> 

Tout en faisant quelques hypothèses au sujet de votre document XML complet, l'avantage ici est qu'il n'y a pas besoin de faire une boucle pour chaque enfant de <BS0900_summary_block> (l'hypothèse ici étant que <BS0900_summary_block> est toujours présent.)

+0

plusieurs thots, laissez-moi essayer votre suggestion aujourd'hui et" validez "votre réponse! –