2010-08-05 5 views
0

Cela fait un moment que j'ai fait un XSL, alors pardonnez-moi si c'est un peu déroutant.Comment détecter le contenu de nœuds XML avec le même nom pendant XSL "apply-template"

J'ai un fichier XML, que j'ai besoin de transformer avec XSL. Tout fonctionne bien jusqu'à ce que j'essaie de détecter "catégorie", car il y a plusieurs nœuds "catégorie" pour chaque élément.

Une partie du fichier XML:

<ROOT> 
<blog day="20" id="4" live="201007200947" month="7" monthname="July" year="2010"> 
    <blog_date><![CDATA[2010-07-20 09:47:00.0]]></blog_date> 
    <filepath><![CDATA[2010/20100720_4.htm]]></filepath> 
    <title><![CDATA[Blog title 1]]></title> 
    <category><![CDATA[Testing]]></category> 
    <category><![CDATA[Training]]></category> 
    <author_id><![CDATA[146]]></author_id> 
    <keywords/> 
    <summary><![CDATA[New British Gas Smart Metering recruits Paul Williams and Alex Egan give their first impressions.]]></summary> 
</blog> 

Exemple de fichier XSL

<xsl:template match="//ROOT"> 
    <xsl:apply-templates select="//blog 
         [@live &lt;= $ThisDate] 
         [not($AuthorId) or (author_id = $AuthorId)] 
         [not($BlogYear) or (not($BlogMonth) or (@month = $BlogMonth and @year = $BlogYear))] 
     [not($BlogCategory) or (translate(translate(category, $uppercase, $lowercase),$specialchar,'') = $BlogCategory)] 
         "> 
     <xsl:sort value="blog_date" order="descending"/> 
    </xsl:apply-templates> 

$ blogcategory est envoyé dans une URL, et a tous les caractères spéciaux et des espaces dépouillé (d'où le "traduire" sur "catégorie").

Si je filtre le XML par catégorie "Testing" alors cela fonctionne bien, mais si je trier par catégorie "Training" il ne renvoie aucune valeur. Je sais que c'est parce qu'il ne regarde que le premier noeud avec le nom "catégorie", mais quelqu'un peut-il suggérer une solution? J'ai essayé une boucle for-each dans le passé, et cela fonctionne mais n'est pas idéal car la position() est toujours égale à 1, donc l'ajout de navigation dans le fichier xsl n'est pas possible.

Idéalement, je voudrais un correctif qui pourrait rester dans le template-apply. J'utilise XSLT 2.0.

Merci, Kate

+0

Un soupçon rapide pas liée à la question, si vous utilisez peut-être XSLT 2.0 vous pouvez utiliser 'fn: lower-case()', 'fn: majuscule()' et les différentes fonctions de codage URI disponibles parmi les fonctions XPath pour améliorer votre code. –

+0

Ne commencez pas un modèle (xsl: template/@ match) avec l'opérateur '//'. Ne lancez pas non plus une expression de chemin avec l'opérateur '//' quand cela n'est pas nécessaire: dans votre cas, xsl: apply-templates/@ select = "blog [etc ...]" ça marchera. –

Répondre

2

Vous devez changer légèrement le filtre. Ce qui suit devrait faire l'affaire car il sélectionnera tous les blog nœuds qui ont un enfant category dont la valeur se traduit aux valeurs de $BlogCategory:

category[translate(translate(., $uppercase, $lowercase),$specialchar,'') = $BlogCategory]] 
+0

C'est génial - merci beaucoup! (P.S. il y a un extra) à la fin) – katebp

Questions connexes