2009-09-10 4 views
3
<module> 
<component> 
    <section> 
     <ptemplateId root="1.8"/> 
     <entry> 
    <observation> 
     <templateId root="1.24"/> 
    </observation> 
     </entry> 
    </section> 
</component> 
<component> 
    <section> 
     <ptemplateId root="1.10"/> 
     <entry> 
    <observation> 
     <templateId root="1.24"/> 
    </observation> 
     </entry> 
    </section> 
</component> 
<component> 
    <section> 
     <ptemplateId root="1.23"/> 
     <entry> 
    <observation> 
     <templateId root="1.24"/> 
    </observation> 
    <entryRelation> 
     <observation> 
     <templateId root="1.24"/> 
     </observation> 
    </entryRelation> 
     </entry> 
    </section> 
</component> 
<component> 
     <section> 
      <ptemplateId root="1.8"/> 
      <entry> 
     <observation> 
      <templateId root="1.24"/> 
     </observation> 
     <entryRelation> 
      <observation> 
      <templateId root="1.28"/> 
      </observation> 
     </entryRelation> 
      </entry> 
     </section> 
    </component> 
</module> 

Je voudrais sélectionner l'observation dans un modèle basé sur ptemplateId, puis-je connaître l'expression de correspondance pour cela?Expression xpath pour sélectionner un noeud enfant en fonction des propriétés parentes

<xsl:template match"******"> 
    <!-- some processing goes here to process 
     observation if ptemplateId is 1.8... --> 
</xsl:template> 

<xsl:template match"******"> 
    <!-- some processing goes here to process 
     observation if ptemplateId is other than 1.8... --> 
</xsl:template> 


there can be nested observation's also. (i am looking for a match expression with axis expressions to make it more generic) 

Répondre

6

Essayez ceci:

/module/component/section[ptemplateId/@root='1.23']//observation 

Substituer la valeur racine ptemplateId/de @ que vous voulez au lieu de '1,23', bien sûr. Cela devrait couvrir les observations imbriquées, tant qu'elles se produisent n'importe où en tant qu'enfants de la section qui contient ptemplateId.

Vous pouvez l'essayer sur mon testeur xpath en ligne, here.

Est-ce que cela fonctionne pour vous?

Editer: Vous pouvez également considérer cette variante, pour placer dans un <xsl:template match="..." />.

<xsl:template match="observation[ancestor::section/ptemplateId/@root = '1.23']"/> 
2

Je ne peux pas tester ce moment et il a été un Litle alors que je l'ai fait XPath, mais je pense que les éléments suivants devraient fonctionner. Il navigue dans l'arbre jusqu'au nœud contenant l'attribut racine avec une valeur égale à 1.23 et utilise ensuite .. ce qui fait référence à parrent.

//module/component/section/ptemplateId[@root='1.23']/.. 
+0

Le parent de ptemplateId va être la section, et la question est demander les observations ... Peut-être que cela fonctionnerait, cependant? //module/component/section/ptemplateId[@root='1.23']/..//observation –

0

Une alternative serait l'utilisation d'une clé XSL:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <!-- the key indexes all <observation> elements by their ptemplateId --> 
    <xsl:key 
    name="kObservation" 
    match="observation" 
    use="ancestor::section[1]/ptemplateId/@root" 
    /> 

    <xsl:template match="/"> 
    <!-- you can then select all the matching elements directly --> 
    <xsl:apply-templates select="key('kObservation', '1.8')" /> 
    </xsl:template> 

    <xsl:template match="observation"> 
    <!-- (whatever) --> 
    <xsl:copy-of select="." /> 
    </xsl:template> 

</xsl:stylesheet> 

Les rendements ci-dessus:

<observation> 
    <templateId root="1.24" /> 
</observation> 
<observation> 
    <templateId root="1.24" /> 
</observation> 
<observation> 
    <templateId root="1.28" /> 
</observation> 
Questions connexes