2010-09-07 7 views
2

J'utilise une application Java basée sur Saxon pour l'analyseur XPath. S'il vous plaît considérer les points suivants:Requête XPath: Comment faire référence au 'noeud courant' (Java/Saxon)

<import> 
    <record ref="abc"> 
    <id>123</id> 
    <data>Value<data> 
    </record> 
    <record ref="def"> 
    <parent>123</parent> 
    <data>Value2</data> 
    </record> 
</import> 

Mon cas d'utilisation est, je suis en boucle à travers les noeuds d'enregistrement et de besoin de chercher un autre avec ref attribut égal à la valeur sous le nœud parent de l'enfant.

Si le nœud actuel est <record ref="def">, comment puis-je écrire une requête pour renvoyer le nœud de données dans le premier nœud d'enregistrement en faisant correspondre /query/record/id/text() = current node/parent/text()?

Si j'exécute cette requête:

/import/record[id/text() = '123']/data 

Puis-je obtenir le nœud de données correct, mais je ne peux pas sembler en mesure de remplacer « 123 » pour la valeur sous le nœud parent?

J'ai essayé de remplacer '123' with ./parent/text() et pendant la compilation de XPath, aucun résultat n'est renvoyé.

Merci,

JB

Répondre

0

La période est utilisée pour faire référence au noeud courant. Cependant, vous avez une faille dans votre logique: Qu'est-ce que votre chemin

/import/record[id/text() = ./parent/text()]/data 

définit est un <record> qui a un parentet un enfant id qui doit avoir le même contenu.

+0

droite, alors comment puis-je faire référence au noeud courant (, celui que je passe dans la méthode d'évaluation XPath), donc je peux utiliser la valeur sous parent? – user267749

+2

J'ai compris!/import/record [id =/import/record [position()]/parent]/data – user267749

1

Avec la période que vous faites référence à un nœud dans le contexte de chemin, vous devriez être en mesure d'utiliser des variables pour résoudre votre problème:

<xsl:template match="/import/record[@parent]"> 
    <xsl:variable name="pid" select="./parent/text()" /> 
    <xsl:for-each select="/import/record[id/text() = $pid"> 
     <!-- actions --> 
    </xsl:for-each> 
</xsl:template> 

modifier

Vous pourriez vous en sortir avec quelque chose comme la seule expression XPath suivante:

/import/record[id/text() = /import/record/parent/text()]/data 

(sélectionner les enregistrements qui sont référencés par d'autres)

+0

J'apprécie vraiment le temps que vous avez pris pour l'écrire, mais je n'utilise pas XLST. J'utilise XPath directement contre un DOM. – user267749

+0

Pouvez-vous utiliser la même approche à partir du code, ou doit-il être dans une seule expression de chemin? – rsp

+0

Une seule expression. Je vois que XLST a du courant, mais il semble n'y avoir aucune disposition lors de l'analyse d'un DOM - voir la liste des fonctions: http://www.saxonica.com/documentation/functions/intro.html – user267749

0

Pour une raison quelconque, current() existe dans XSLT mais pas pour XPath contre un DOM. Vous pouvez coder en dur quelque chose comme ceci:

/import/enregistrement [id =/import/enregistrement [poste()]/parent]/données

+0

En fait, je ne suis pas sûr que cela fonctionne :-) – user267749

Questions connexes