2009-09-09 6 views
0

Je dois créer une table en utilisant XSLT et CSS. Le tableau devrait ressembler à:Comment dynamiquement obtenir la valeur d'une ligne en utilisant XSLT

 
ID FNAME 
1 AA 
2 BB 

Mon XML est:

<students> 
    <studentDetails> 
    <id>1</id> 
    <fname>AA</fname> 
    </studentDetails> 
    <studentDetails> 
    <id>2</id> 
    <fname>BB</fname> 
    </studentDetails> 
<students> 

Et voici mon XSLT jusqu'à présent:

<xsl:template match="students"> 
    <div> 
    <div class="idcol"> 
     <div class="header"> 
     <xsl:text>ID</xsl:text> 
     </div> 
     <div class="row"> 
     <xsl:value-of select="studentDetails[1]/id"/> 
     </div> 
     <div class="row"> 
     <xsl:value-of select="studentDetails[2]/id"/> 
     </div> 
    </div> 
    <div class="fnamecol"> 
     <div class="header"> 
     <xsl:text>FNAME</xsl:text> 
     </div> 
     <div class="row"> 
     <xsl:value-of select="studentDetails[1]/fname"/> 
     </div> 
     <div class="row"> 
     <xsl:value-of select="studentDetails[2]/fname"/> 
     </div> 
    </div> 
    </div> 
</xsl:template> 

La sortie semble juste après l'application de CSS, mais le problème est que j'ai utilisé [1] et [2] directement. Donc, s'il y a une troisième rangée, je dois encore changer mon code. Comment faire cela dynamiquement en utilisant un index - quelqu'un peut-il aider?

Répondre

2

Vous pouvez utiliser <xsl:for-each>, mais je pense que cela est plus concis et extensible arbitrairement de colonnes (tant qu'ils sont tous les mêmes):

<xsl:stylesheet version="1.0" xmlns:xs="..."> 

    <xsl:template match="students"> 
    <div> 
     <div class="idcol"> 
     <div class="header"> 
      <xsl:text>ID</xsl:text> 
     </div> 
     <xsl:apply-templates> 
      <xsl:with-param name="child-name" select="'id'"/> 
     </xsl:apply-templates> 
     </div> 
     <div class="fnamecol"> 
     <div class="header"> 
      <xsl:text>FNAME</xsl:text> 
     </div> 
     <xsl:apply-templates> 
      <xsl:with-param name="child-name" select="'fname'"/> 
     </xsl:apply-templates> 
     </div> 
    </div> 
    </xsl:template> 

    <xsl:template match="studentDetails"> 
    <xsl:param name="child-name"/> 
    <div class="row"> 
     <xsl:value-of select="*[name() = $child-name]"/> 
    </div> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Merci, ça a marché pour moi. – Wondering

+0

pouvez-vous expliquer cette ligne de code? – Wondering

+0

+1 pour la solution. Et pour vous obtenir plus de 10k. ;-) – Tomalak

0

Tout d'abord vous devez réorganiser votre code HTML représenter chaque rangée en une seule pièce. Si vous organisez la table en colonnes, il n'est pas facile de créer ce code à partir de vos données XML source. Après avoir réorganisé votre code HTML, vous pouvez écrire un nouveau modèle pour le nœud "studentDetails". Déplacez le code de chaque ligne dans ce modèle. Dans le modèle qui correspond au nœud "étudiant", insérer

<xsl:apply-templates match="studentDetails" /> 

pour insérer les informations pour chaque étudiant.

2

Une solution encore plus dynamique (lignes dynamiques et colonnes):

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
>  
    <xsl:output method="xml" indent="yes" encoding="utf-8" /> 

    <xsl:variable name="l" select="'abcdefghijklmnopqrstuvwxyz'" /> 
    <xsl:variable name="u" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" /> 
    <xsl:key name="kSd" match="studentDetails/*" use="name()" /> 

    <xsl:template match="students"> 
    <div> 
     <xsl:for-each select="studentDetails[1]/*"> 
     <div class="{name()}col"> 
      <div class="header"> 
      <xsl:value-of select="translate(name(), $l, $u)" /> 
      </div> 
      <xsl:apply-templates select="key('kSd', name())" /> 
     </div>   
     </xsl:for-each> 
    </div> 
    </xsl:template> 

    <xsl:template match="studentDetails/*"> 
    <div class="row"> 
     <xsl:value-of select="." /> 
    </div> 
    </xsl:template> 

</xsl:stylesheet> 

produit:

<div> 
    <div class="idcol"> 
    <div class="header">ID</div> 
    <div class="row">1</div> 
    <div class="row">2</div> 
    </div> 
    <div class="fnamecol"> 
    <div class="header">FNAME</div> 
    <div class="row">AA</div> 
    <div class="row">BB</div> 
    </div> 
</div> 
+0

Merci Tomalak pour votre aide. C'est vraiment cool. :-) – Wondering

Questions connexes