2010-02-07 47 views
1

我有當前的結構;XSLT:獲取具有指定值的最近項目? (Sitecore)

Item 1 
- Subitem 1 
- Subitem 2 
- Subitem 3 
- - Sub subitem 1 
- - Sub subitem 2 
- - Sub subitem 3 
- - etc 

我有一個字段只在「項目1」上定義。我們稱之爲'標題'。

當我在「項目1」時,很容易提取這個值,但是當我在其他項目上時呢?有沒有一種方法可以通過樹(上),直到我找到一個名爲'Header'的字段並且它有一個值,然後停止並將其用作我的子項中的參考點?

回答

1

如果您想查找樹並找到包含包頭屬性的最接近的元素,則應該使用類似這樣的東西。

<xsl:value-of select="(ancestor::*/@Header[.!=''])[last()]" /> 

它使用ancestor軸來查找樹和XPath表達式查找與屬性是誰的值不爲空的任何元素。

第二個過濾器用於評估最後一個之一。如果存在具有值的@Header的多個祖先,則最後的一個會最接近上下文節點,因爲結果是文檔的訂單

編輯:的另一種方法找到了相同的結果,利用以下事實:在反向文檔順序ancestor軸返回將是把過濾標準在斷言對於ancestor軸步驟中,選擇第一個(與上下文節點最近匹配),然後進入@Header:

<xsl:value-of select="ancestor::*[@Header!=''][1]/@Header" /> 
+0

啊 - 看起來不錯。在這個例子中,這個代碼是否也適用於「Item 1」? (包含標題值的項目)? – kastru 2010-02-07 13:10:41

+0

是的,它應該可以工作,但是您可以將其從任何元素(即*)上的匹配更改爲特定元素名稱Item1以更具體地匹配。 – 2010-02-07 13:29:57

+0

祖先軸被反向排序。 「最接近」的'@ header'不是'[last()]',它是'[1]'。 – Tomalak 2010-02-07 14:49:26

1

如果您當前的上下文不是Item 1而是它的一個孩子,則可以使用軸ancestor獲取其數據。

因此,假設您的Item 1元素有一個名爲Header的屬性,你可以做這樣的事情:

<xsl:value-of select="ancestor::Item1/@Header"/> 

這裏假設你的XML結構(你真的應該在你的問題已經提供)看起來是這樣的:

<Item1 Header="a header"> 
    <Subitem1/> 
    <Subitem2/> 
    <!-- etc --> 
</Item1> 

並且名稱「Item1」在此結構中是唯一的。

+0

+1。缺少的是解釋:'通過「accident」得到最接近的@Header值。它選擇所有祖先標題,並且僅查看列表中第一個的值。根據祖先軸的排序順序,這恰好是最接近的。 – Tomalak 2010-02-07 14:55:50

相關問題