2009-08-24 10 views
2

je le XML document suivant (partiel):Comment appliquer un modèle XSL uniquement aux éléments contenant un enfant avec une valeur d'attribut et une valeur d'élément particulières?

<export> 
<table name="CLIENT"> 
    <row> 
     <col name="CODE_CLIENT" type="System.String">1000010026</col> 
     <col name="LIBELLE" type="System.String">Test|</col> 
     <col name="PROSPECT" type="System.Decimal">1</col> 
    </row> 
    <row> 
     <col name="CODE_CLIENT" type="System.String">1000010025</col> 
     <col name="LIBELLE" type="System.String">Rue de la 2eme ad|</col> 
     <col name="PROSPECT" type="System.Decimal">0</col> 
    </row> 
    <row> 
     <col name="CODE_CLIENT" type="System.String">1000010125</col> 
     <col name="LIBELLE" type="System.String">Test4</col> 
     <col name="PROSPECT" type="System.Decimal">0</col> 
    </row> 
    <row> 
     <col name="CODE_CLIENT" type="System.String">1000010035</col> 
     <col name="LIBELLE" type="System.String">Rue</col> 
     <col name="PROSPECT" type="System.Decimal">1</col> 
    </row> 
    </table></export> 

et XSL suivant:

<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="text" indent="yes"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="export/table[@name='CLIENT']"/> 

    </xsl:template> 

    <xsl:template match="row"> 
     SOME TEMPLATE CODE 

    </xsl:template> 


</xsl:stylesheet> 

je voudrais appliquer le premier modèle (match = "/") uniquement à la " rows "qui ont une valeur de prospect à 1. Dans mon exemple, cela ne ferait que transformer les première et dernière lignes.

J'ai essayé

<xsl:apply-templates select="export/table[@name='CLIENT']/row[col[@name='PROSPECT']=1]"/> 

mais cela m'a donné une erreur de syntaxe.

Quelqu'un sait comment procéder?

Répondre

2

Ma suggestion:

<xsl:stylesheet 
    version="1.1" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:output method="text" indent="yes"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="export/table[@name='CLIENT']"/> 
    </xsl:template> 

    <xsl:template match="table"> 
    <xsl:apply-templates select="row[col[@name='PROSPECT' and text() = '1']]" /> 
    </xsl:template> 

    <xsl:template match="row"> 
    SOME TEMPLATE CODE 
    </xsl:template> 

</xsl:stylesheet> 

Bien que votre essai:

<xsl:apply-templates select=" 
    export/table[@name='CLIENT']/row[col[@name='PROSPECT']=1] 
"/> 

devrait travail aussi bien (il est pas aussi évident, mais il ne se trompe pas en soi) . Je ne sais pas pourquoi cela ne fonctionne pas pour vous.

+0

Tomalak, merci pour votre réponse. J'ai essayé votre suggestion et j'ai eu la même erreur que j'avais avec ma version: ']' requis, '@' trouvé :-( – Jalil

+0

Tomalak, je suis désolé, je n'ai pas essayé exactement votre solution mais directement: Je vais essayer votre solution comme c'est maintenant – Jalil

+0

En passant, s'il vous plaît dire au processeur XSLT que vous utilisez – Tomalak

0

Attention: entièrement non testé. Il pourrait même ne pas analyser correctement.

<xsl:template match="row[string(./col[@name='PROSPECT']) = '1']"> 

</xsl:template> 
+0

Merci Dirk. Je n'ai pas essayé votre réponse, comme j'ai commencé avec celle de Tomalak, mais cela semble plutôt bien. Je garde l'exemple pour une utilisation ultérieure ;-) – Jalil

0

J'ai essayé vos apply-templates et il n'a pas échoué. Etes-vous sûr que l'erreur est dans les apply-templates?

+0

L'erreur que j'ai eu était: ']' requis, '@' trouvé – Jalil

0
<xsl:apply-templates select="export/table[@name='CLIENT']/row/col[text()='1' and @name='PROSPECT']"/> 
Questions connexes