2009-10-08 7 views
2

J'ai un fichier XML que j'essaie de transformer en XHTML en utilisant un fichier XSLT. Je me demandais s'il était possible d'obtenir le nombre de fois qu'un modèle a été invoqué. Ceci est mon XML:impression d'un compte avec XSLT

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" encoding="UTF-8" href="car.xslt" version="1.0"?> 
<vehicle> 
    <car> 
    <make>Honda</make> 
    <color>blue</color> 
    </car> 
    <car> 
    <make>Saab</make> 
    <color>red</color> 
    </car> 
</vehicle> 

Et voici mon XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
    <table cellpadding="5" border="1"> 
    <tr><td>number</td><td>make</td><td>color</td></tr> 
     <xsl:apply-templates/> 
    </table> 
</body> 
</html> 
</xsl:template> 

<xsl:template match="car"> 
    <tr> 
     <td>#</td><td><xsl:value-of select="make"/></td><td><xsl:value-of select="color"/></td> 
    </tr> 
</xsl:template> 

</xsl:stylesheet> 

Je veux imprimer le nombre de fois où une voiture a été imprimé à la place de #, il ressemblerait à ceci :

numéro faire la couleur Honda bleu Saab rouge

au lieu de:

Numéro faire la couleur # Honda bleu # Saab rouge

Tout le monde a des idées? J'espérais cela pourrait se faire avec juste xsl: value-of et XPath

Répondre

3

Replace

#

Avec

<xsl:value-of select="position()"/> 
+0

qui imprime: nombre \t font \t couleur Honda \t bleu Saab \t rouge mais je voulais nombre \t font \t couleur Honda \t bleu Saab \t rouge Je vérifie pour voir s'il y a de toute façon à donner des arguments à propos du poste th, etc .... –

+0

on pourrait dire, position() * 0.5 ... mais pourquoi tout est multiplié par deux? –

+0

Lorsque vous utilisez 'position()' dans ce contexte, XSLT énumère les nœuds enfants de l'élément 'vehicle'.Les nœuds enfants dans l'exemple original sont: (1) un nœud de texte (un groupe d'espaces); (2) un élément «voiture»; (3) un nœud de texte (plus d'espace); (4) un élément «voiture»; (5) un nœud de texte (plus d'espace). Donc, quand vous faites correspondre les éléments 'car', vous obtenez l'élément numéro 2 et le numéro 4. –

1

Vous pouvez réorganiser un peu de sorte qu'au lieu de en utilisant <xsl:apply-templates/>, faire quelque chose comme ceci:

<tr><td>number</td><td>make</td><td>color</td></tr> 
<xsl:for-each select="/vehicle/car"> 
    <tr> 
    <td><xsl:value-of select="position()" /></td><td>...</td> 
    </tr> 
</xsl:for-each> 

Dans ce cas, la fonction position() fait référence au numéro d'itération de la boucle for-each associée. Cela peut vous donner ce que vous cherchez.

+0

Ceci serait ma méthode préférée. J'étais juste trop paresseux pour le taper dehors. – ChaosPandion

1

changement minimal:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns="http://www.w3.org/1999/xhtml" 
> 
    <xsl:template match="/vehicle"> 
    <html> 
     <body> 
     <table cellpadding="5" border="1"> 
      <tr> 
      <td>number</td> 
      <td>make</td> 
      <td>color</td> 
      </tr> 
      <xsl:apply-templates select="car" /> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="car"> 
    <tr> 
     <td><xsl:value-of select="position()" /></td> 
     <td><xsl:value-of select="make" /></td> 
     <td><xsl:value-of select="color" /></td> 
    </tr> 
    </xsl:template> 

</xsl:stylesheet> 

Notez l'attribut select="car" sur le <xsl:apply-templates>. Il s'assure que seuls les nœuds <car> sont comptés, donc votre position() n'est pas éteint.

Notez également que le modèle principal correspond maintenant à l'élément document, pas au nœud racine.