2010-09-28 4 views
0

J'utilise xslt pour transformer un document XML en HTML pour une utilisation dans un courrier électronique. J'ai besoin de comparer les éléments xml avec une autre valeur d'élément xml afin que je sache quel format donner à la valeur. Fondamentalement, j'ai une structure XML en tant que tel:Comment comparer un élément XML avec une variable XSL

<main> 
    <comparer>1</comparer> 
    <items> 
     <item> 
      <name>blarg</name> 
      <values> 
       <value>1</value> 
       <value>2</value> 
      </values> 
    </items> 
</main> 

Les informations de l'élément est utilisé pour construire une table:

<table> 
    <tr> 
     <td>blarg</td> 
     <td>1</td> 
     <td>2</td> 
    </tr> 
</table> 

Ce que je dois être en mesure de faire est d'utiliser xsl pour comparer les valeurs des éléments avec la valeur du nœud 'de comparaison' et si elles sont égales, mettez la cellule dans la table en gras sinon la valeur de la cellule sera affichée en gras. Je dois accomplir ceci sans l'utilisation de javascript ainsi il doit être fait en xsl. En ce moment, je cherche à utiliser une variable xsl: variable puis en essayant d'utiliser le xsl: quand faire la comparaison. Malheureusement, j'ai peu de chance. Voilà ce que je viens de commencer à jouer avec pour chaque ligne de la table:

<xsl:variable name="compare" select="//main/comparer" /> 

...  

<xsl:for-each select="value"> 
    <td> 
     <xsl:choose> 
      <xsl:when test=". = $compare"> 
       <b> 
        <xsl:value-of select="."/> 
       </b> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="."/>. 
      </xsl:otherwise> 
     </xsl:choose> 
    </td> 
</xsl:for-each> 

* Remarque: Je suis parti à la plupart des xsl par souci de concision. J'essaie juste de me concentrer sur mon problème.

Répondre

1

Je l'ai compris après quelques essais et erreurs. La réponse d'Alejandro semble que cela fonctionnerait, mais je n'ai pas le luxe de restructurer le xsl pour utiliser le template. Voici ce que j'ai utilisé pour résoudre mon problème:

<xsl:variable name="compare" select="//main/comparer" /> 

...  

<xsl:for-each select="value"> 
    <td> 
     <xsl:choose> 
      <xsl:when test="contains(., $expireDate)"> 
       <b> 
        <xsl:value-of select="."/> 
       </b> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="."/>. 
      </xsl:otherwise> 
     </xsl:choose> 
    </td> 
</xsl:for-each> 
0

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="main"> 
     <table> 
      <xsl:apply-templates select="items"/> 
     </table> 
    </xsl:template> 
    <xsl:template match="item"> 
     <tr> 
      <xsl:apply-templates/> 
     </tr> 
    </xsl:template> 
    <xsl:template match="name|value"> 
     <td> 
      <xsl:apply-templates/> 
     </td> 
    </xsl:template> 
    <xsl:template match="value/text()[.=/main/comparer]"> 
     <b> 
      <xsl:value-of select="."/> 
     </b> 
    </xsl:template> 
</xsl:stylesheet> 

sortie:

<table> 
    <tr> 
     <td>blarg</td> 
     <td> 
      <b>1</b> 
     </td> 
     <td>2</td> 
    </tr> 
</table> 

Remarque: Recherche de motif et le noeud ensemble des comparaisons.

+0

Existe-t-il un moyen de ne pas avoir à restructurer le document pour utiliser le modèle? Quelque chose comme:

+0

@gun_shy: La correspondance de modèle ** est ** ce qu'est XSLT. Pour le test, utilisez la comparaison des ensembles de nœuds: =/main/"J'aime", comme je l'ai fait dans le prédicat de pattern. –

Questions connexes