2010-12-09 4 views
1

J'ai un document XML qui montre ceci:XSLT ciblant un élément en fonction du type CustomTagAttribs

<Element> 
    <Content> 

    <CustomTagAttribs> 
     <type>breadcrumb</type> 
    </CustomTagAttribs> 

    <ElementData> 
     <LBarItem>TEXT!</LBarItem> 
    </ElementData> 

    </Content> 
<Element> 

Et il y a une autre instance <Element> comme celui ci-dessus, mais sans <type>breadcrumb</type>. Je veux cibler les LBarItems uniquement dans le <Element> qui a le type de fil d'Ariane. Comment ferais-je cela?

C'est ce que j'ai essayé:

<xsl:for-each select="//Content/ElementData/LBarItem"> 
    <xsl:if test="../type='breadcrumb'"> 
    <xsl:value-of select="Title"/> 
    </xsl:if> 
</xsl:for-each> 

Toute aide?

+0

Bonne question, +1. Voir ma réponse pour une solution complète qui montre comment éviter complètement l'utilisation de la logique conditionnelle lors de la résolution de tels problèmes. :) –

Répondre

2

Pourquoi utilisez-vous pas:

/Element/Content[CustomTagAttribs/type = 'breadcrumb']/ElementData/LBarItem 
+0

Je vais maintenant! Je vous remercie! – jrottier

+0

@jrottier: Vous êtes bienvenu. –

+0

Alors, est-il possible de spécifier LBarItems qui ne sont pas dans l'élément "breadcrumb"? L'autre élément que j'ai n'a pas de type spécifié, donc je ne peux pas le cibler. J'ai essayé d'ajouter "!" à CustomTagAttribs/type! = 'breadcrumb' mais cela ne semble pas fonctionner. – jrottier

1

Vous n'avez pas besoin d'utiliser <xsl:for-each> et toute logique conditionnelle du tout.

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes"/> 
    <xsl:template match="Content[CustomTagAttribs/type='breadcrumb']/*/LBarItem"> 
     <xsl:copy-of select="."/> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur ce document XML (contenant deux Element éléments):

<t> 
    <Element> 
     <Content> 
      <CustomTagAttribs> 
       <type>breadcrumb</type> 
      </CustomTagAttribs> 
      <ElementData> 
       <LBarItem>I have "breadcrumb" type</LBarItem> 
      </ElementData> 
     </Content> 
    </Element> 
    <Element> 
     <Content> 
      <CustomTagAttribs> 
       <type>something else</type> 
      </CustomTagAttribs> 
      <ElementData> 
       <LBarItem>I have "something else" type</LBarItem> 
      </ElementData> 
     </Content> 
    </Element> 
</t> 

produit le résultat souhaité, correct:

<LBarItem>I have "breadcrumb" type</LBarItem> 
+0

Merci! Très utile! – jrottier

Questions connexes