2010-12-02 14 views
4

私は非常に汎用的なXML構造で作業しています。ここではすべてが項目です(とにかくこの質問に関係するすべて)。特定の属性を持つ要素の子である祖先を見つける方法は?

私が現在使っているアイテム要素と、探しているノードの親であるアイテム要素を知ることに基づいて、アイテムを見つける必要があります。私は動作しているxpathを持っていますが、かなりリソースが集中しており、よりエレガントで安価なものを探しています。

<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> 

実際のXMLがされています(それは実際にドキュメントルートの子ではないのですが)

項目キー=ノードは私が探している要素の親

XMLですはるかに深く、はるかに分岐しています。

たとえば、私がkey = g、eまたはfの項目にいる場合、key = eの項目を返す必要があります。私がキーb、c、またはdを持つアイテムにいる場合、キー= bのアイテムを返す必要があります。

私はこのxpathを使用していますが、動作していますが、祖先の子孫軸を上って戻ってきて、必要以上に長い時間がかかるようです。

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

私は私が上だ1)ノードと私が探しているノードの親の2)キー属性を知っていることを念頭に置き、これを行う簡単な方法はありますか?

XMLはSitecoreが生成されたもので、実際にはcurrent()関数を使用していないため、sc_currentitemパラメータを使用して処理を開始する必要がある開始ノードを設定しています。

ありがとうございます。

+0

はすでに(私の目に)、非常に簡単に見えます。私はもっ​​と酷いXPathsを見た。 – jwueller

+0

これは複雑さではなく、処理しているXMLの深さです。恐ろしいことです。私が探しているノードの親は、アイテムの子孫/子孫の膨大な数を持つことができます。私は本当にすべてのブランチに行きたくありません。 –

答えて

6

用途:

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

ありがとう、これは私が以前試みていたもののようなものですが、構文を掘り下げました!完璧。 –

+1

@James Walford:あなたはウェルカムです! –

関連する問題