2010-08-26 3 views
0

J'ai un problème avec une instruction xpath.Évaluation de l'expression xpath externe dans xpath-predicate

Fondamentalement, le problème peut être expliqué au code suivant:

<xsl:for-each select="/b1im:B1IMessage/b1im:Header/b1im:Z/SortInbound/group"> 
        <!-- Check if entry from duplicate table is found for the current AccountingEntry --> 
        <xsl:variable name="externalId" select="../externalId"></xsl:variable> 
        <xsl:value-of select="/b1im:B1IMessage/b1im:Body/b1im:Payload[@ObjectRole=&apos;CA&apos;]/jdbc:SqlResult/jdbc:ResultSet/jdbc:Row[jdbc:external_id= /../externalId]/jdbc:external_id"></xsl:value-of> 
        <xsl:variable name="group" select="./@id"></xsl:variable>       
        <!-- if it is no dupe => output --> 
        <xsl:choose> 
          <xsl:when test="/b1im:B1IMessage/b1im:Body/b1im:Payload[@ObjectRole=&apos;CA&apos;]/jdbc:SqlResult/jdbc:ResultSet/jdbc:Row[jdbc:external_id = ../externalId]/jdbc:external_id"> 

Ce que je veux faire est, utiliser la valeur de "../externalId" (contexte de for-each) pour un test (dernière ligne) .. Cela fonctionnerait si j'utilisais une variable ($ externalId), mais la variable n'est définie qu'une seule fois (première boucle d'itération) ... Existe-t-il un moyen d'accéder au for-each-context dans l'expression xpath?

Merci d'avance !! Tobias

+0

Ajout balise 'xslt' que cette expression XPath est hébergé par XSLT –

Répondre

2

A chaque étape de l'évaluation XPath, le "." (noeud contextuel) a une signification différente. Dans votre expression XPath
... jdbc:ResultSet/jdbc:Row[jdbc:external_id = ../externalId] le nœud de contexte dans le prédicat est déterminé par les étapes précédentes dans votre expression XPath, de sorte que vous comparez réellement à externalID enfant de l'élément jdbc:ResultSet. Pour comparer à la valeur de ../externalID du nœud de contexte pour chaque, vous pouvez essayer d'utiliser la fonction XSLT current().

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = current()/../externalId]

1

Deux questions.

Tout d'abord, comme @jasso a répondu, lors de l'évaluation des prédicats, le contexte est déterminé par la dernière étape. De http://www.w3.org/TR/xpath/#predicates

Un prédicat filtre un ensemble de noeuds avec rapport à un axe pour produire un nouvel ensemble de noeuds . Pour chaque noeud dans l'ensemble de nœuds à filtrer, la PredicateExpr est évaluée à ce noeud comme le nœud de contexte, à l' nombre de noeuds dans l'ensemble de nœuds que la taille du contexte , et avec la position de proximité du nœud dans l'ensemble de nœuds par rapport à l'axe que la position de contexte

seconde. Vous avez écrit:

Il fonctionnerait si j'utilisé une variable (ExternalId $), mais la variable est seulement fixé une fois (première boucle itération) ...

Ce n'est pas vrai. Le modèle de contenu for-each est instancié une fois pour chaque nœud de l'ensemble de nœuds sélectionné. Ainsi, externalId est évalué une fois pour chacun de ces nœuds.

Ainsi, la bonne réponse de @jasso:

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = current()/../externalId] 

est le même que:

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = $externalId] 
+0

@Alejandro, Bonne réponse +1 En pratique, quand vous avez répondu à une question, j'ai rarement besoin d'ajouter quelque chose à votre réponse. –

+0

@Dimitre: Ja!Merci! La même chose m'arrive. ;) –

+0

Merci à vous deux, je l'ai eu au travail :) la méthode avec la variable n'a pas fonctionné pour moi en premier lieu parce que j'avais une faute dans mon entrée-xml .. Néanmoins, bon de connaître le courant ()-fonction! Merci – mnkypete