2010-02-23 8 views
4

Quelqu'un peut-il m'aider avec ce petit problème que j'ai.XPath Sélectionner le noeud à partir de la valeur actuelle du noeud lorsque les deux noms d'attribut sont les mêmes

Le XML

<MPN> 
    <MTR MSN="AB123456"/> 
    <MTR MSN="AB654321"/> 
    <MTR MSN="AB654322"/> 
    <MTR MSN="AB654323”/> 
    <MTR MSN="AB654324"/> 
    <JOB JobId="136"> 
     <JMR MSN="AB123456"> 
      <JRA DateActionRequiredBy="20090701120012" /> 
     </JMR> 
     <JMR MSN="AB654321"> 
      <JRA DateActionRequiredBy="20090701100010" /> 
     </JMR> 
    </JOB> 
</MPN> 

Je voudrais récupérer le DateActionRequiredBy de l'élément JRA, lorsque l'analyseur est assis à l'élément MTR, un seul doit être retourné.

J'ai essayé.

../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy 

qui retourne {Dimension: [2]} NodeSet, cela correspond tout à cause de la @MSN lui-même d'attribut correspondant effectivement pas le parent.

../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy 

qui retourne {Dimension: [2]} NodeSet

J'ai trouvé une solution mais il faudra une variable dans chaque attribut xsl: ce qui ne semble pas juste pour moi.

<xsl:variable name="storeMSN" select="@MSN"/> 
../JOB/JMR[@MSN = $storeMSN]/JRA/@DateActionRequiredBy 

qui retourne 20090701120012 Attribut

C'est ce que je suis après, mais il doit y avoir un moyen plus facile d'atteindre cet autre qu'une variable pour chaque attribut.

Merci d'avance.

Répondre

8
<MPN> 
    <MTR MSN="AB123456"/> 
    <MTR MSN="AB654321"/><!-- current node (i.e. context node) --> 
    <MTR MSN="AB654322"/> 
    <MTR MSN="AB654323”/> 
    <MTR MSN="AB654324"/> 
    <JOB JobId="136"> 
     <JMR MSN="AB123456"> 
      <JRA DateActionRequiredBy="20090701120012" /> 
     </JMR> 
     <JMR MSN="AB654321"> 
      <JRA DateActionRequiredBy="20090701100010" /><!-- desired node --> 
     </JMR> 
    </JOB> 
</MPN> 

alors vous devez utiliser ce XPath:

../JOB/JMR[@MSN = current()/@MSN]/JRA/@DateActionRequiredBy 

Notez que cela fonctionne dans XSLT seulement, puisque current() est une fonction XSLT.

Vous pouvez faciliter le processus en ajoutant une touche XSL:

<xsl:key name="kJMR" match="JMR" use="@MSN" /> 

et XPath:

key('kJMR', @MSN)/JRA/@DateActionRequiredBy 

Explication pourquoi vos essais ne fonctionnent pas comme prévu. Les deux

  • ../JOB/JMR[@MSN = @MSN]/JRA/@DateActionRequiredBy
  • ../JOB/JMR[@MSN = ./@MSN]/JRA/@DateActionRequiredBy

comparer @MSN avec lui-même - une opération qui ne peut manquer. De cette façon, vous obtenez toujours tous les nœuds possibles.

Dans un prédicat, le contexte XPath est toujours le noeud auquel vous appliquez le prédicat. La fonction current() est là pour vous fournir le contexte XSLT.

+0

oui current() était la pièce manquante dans le puzzle. Merci ;-) – Nanook

Questions connexes