2013-08-22 50 views
2

我與父母/子女的依賴幾個項目:Sitecore的渲染:使用條件字段第一項的搜索

項目1 - >項目2 - >項目3

它們具有相同的名稱字段:「主要信息」。他們中的一些人填寫了這個領域,其中一些領域有空的「主要信息」。主要目標:如果選擇填充了「主要信息」的頁面 - 顯示此信息。如果選擇了空白的「主要信息」頁面 - 顯示來自祖先的信息。 所以我要呈現:

<xsl:variable name="home" select="$sc_currentitem/ancestor-or-self::*[contains(@template, 'page') and @Main Info != '']" /> 

<!-- entry point --> 
<xsl:template match="*"> 
    <xsl:apply-templates select="$home" mode="main"/> 
</xsl:template> 

<xsl:template match="*" mode="main">  
    <sc:text field="Right Footer Text" /> 
</xsl:template> 

這說明不了什麼。

<xsl:variable name="home" select="$sc_currentitem/ancestor-or-self::*[contains(@template, 'page')]" /> 

<xsl:template match="*"> 
    <xsl:apply-templates select="$home" mode="main"/> 
</xsl:template> 

<xsl:template match="*" mode="main">  
    <sc:text field="Right Footer Text" /> 
</xsl:template> 

這顯示來自每個選定項目的祖先的「主要信息」。

我怎樣才能得到只有一個「主要信息」?如果此字段不爲空或來自填寫了「主要信息」的第一個父項目,則從所選項目開始。

+0

出於性能原因,您應該考慮使用C#編寫控件,而不是使用XSLT編寫控件。 –

回答

1

從表現上看,您可能不想使用ancestor-or-self選擇器。如果你有很多物品和一棵深深的樹木,那對它的性能不利。

我想我可以創建一個<xsl:choose>像這樣:

<xsl:choose> 
    <xsl:when test="sc:fld('main info',.)!=''"> 
    <sc:text field="main info" select="." /> <!-- Display main info from item --> 
    </xsl:when> 
    <xsl:otherwise> 
    <sc:text field="main info" select=".." /> <!-- Display main info from parent --> 
    </xsl:otherwise> 
</xsl:choose> 

當然,如果有一種可能性,即它不是父母,但父母父(等等),有主的信息,我通過創建我自己的XSL擴展來簡化它。
您可以在Jens Mikkelsen的article上詳細瞭解XSL擴展。

+0

謝謝! XSL擴展它是我需要的!很棒! –

2

我真的相信這說明了爲什麼你應該用C#編寫你的組件,而不是浪費時間試圖通過XSLT「破解」一個解決方案。當然,如果你喜歡,你可以編寫你自己的擴展名 - 但是讓我們考慮一下,這將是多少代碼開始。

在您.ASCX文件,你有這樣的:

<sc:Text runat="server" ID="sctMainInfo" Field="main info" /> 

而在你的.cs代碼隱藏/ codebeside:

Sitecore.Data.Item myItem = Sitecore.Context.Item; // Should be your Datasource item 
while (string.IsNullOrWhiteSpace(myItem["main info"])) 
{ 
    myItem = myItem.Parent; // you need to add a check here, 
          // so you don't move up past your Site Root node 
} 

sctMainInfo.Item = myItem; 

遠遠超過組合XSLT/XSL輔助方法簡單,性能會好很多。

最後一件事。渲染的前提有一個問題。您不應該通過瀏覽項目層次結構來查找組件的內容,而是防止執行M/V測試或個性化組件的任何可能性。然而,這是一個不同日子的故事。

+0

我同意。您應該轉到子圖層... –