2010-12-02 30 views
4

Je travaille avec une structure XML très générique, où tout est un élément (enfin tout ce qui concerne cette question). Basé sur la connaissance de l'élément d'élément que je suis actuellement et l'élément d'élément qui est le parent du noeud que je recherche, je dois trouver un article. J'ai un xpath qui marche, mais c'est assez gourmand en ressources et je cherche quelque chose de plus élégant et moins cher.Comment trouver un ancêtre qui est un enfant d'un élément avec un attribut particulier?

La clé item = un nœud est le parent de l'élément que je cherche (bien que ce n'est pas vraiment un enfant de la racine du document)

XML:

<root> 
    <item key="a"> 
     <item key="b"> 
      <item key="c"> 
       <item key="d"/> 
      </item> 
     </item> 
     <item key="e"> 
      <item key="f"> 
       <item key="g"/> 
      </item> 
     </item> 
    </item> 
</root> 

Le XML réel est beaucoup plus profond et avec beaucoup plus de ramification. Par exemple, si je suis sur l'élément avec la touche = g, e ou f, je dois retourner l'élément avec la touche = e. Si je suis sur l'article avec la clé b, c ou d, je dois retourner l'article avec la touche = b. J'utilise ce xpath, qui fonctionne, mais monter et redescendre l'axe ancêtre-descendant me semble un voyage beaucoup plus long que ce dont j'ai besoin.

current() 
    /ancestor-or-self::item[@key='a'] 
     /item[descendant-or-self::* = current()] 

est-il un moyen plus simple de faire cela, compte tenu du fait que je ne connais que 1) le nœud que je suis et 2) l'attribut clé du parent du nœud que je cherche? Pour l'amour du détail: Le XML est généré par Sitecore, je n'utilise pas la fonction current(), j'utilise le paramètre sc_currentitem pour définir le nœud de départ dont j'ai besoin de commencer le traitement.

Merci d'avance.

+0

semble assez simple, déjà (à mes yeux). J'ai vu des XPaths beaucoup plus effrayants. – jwueller

+0

Ce n'est pas la complexité, c'est la profondeur du XML qu'il traite qui fait peur. Le parent du noeud que je cherche pourrait avoir un grand nombre d'enfants/descendants, je ne veux vraiment pas descendre dans toutes les branches. –

Répondre

6

Utilisation:

ancestor-or-self::*[parent::item[@key='a']] 
+1

Merci, c'est quelque chose comme ce que j'essayais avant, mais maquillé la syntaxe! Parfait. –

+1

@ James Walford: Vous êtes bienvenu! –