2

親/子の依存関係を持つアイテムはほとんどありません:

アイテム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>

これは、選択した項目のすべての先祖からの「主な情報」を示しています。

「主な情報」を 1 つだけ取得するにはどうすればよいですか? このフィールドが空でない場合は選択したアイテムから、または「メイン情報」が入力された最初の親アイテムから。

4

2 に答える 2

2

これは、XSLT を介してソリューションを「ハック」しようとして時間を無駄にするのではなく、C# でコンポーネントを作成することを検討する必要がある理由を示していると本当に信じています。もちろん、必要に応じて独自の拡張機能を作成することもできますが、最初はこれがどれほど小さなコードになるかを考えてみましょう。

.ASCX ファイルでは、次のようになります。

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

そして、あなたの .cs codebehind/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 Helper を組み合わせたアプローチよりもはるかに単純であり、パフォーマンスが大幅に向上します。

最後に一つだけ。レンダリングの前提に問題があります。コンポーネントのコンテンツを見つけるために項目階層をクロールするべきではありません。M/V テストを実行したり、コンポーネントをパーソナライズしたりする可能性を防ぎます。ただし、これは別の日の話です。

于 2013-08-22T15:52:51.457 に答える
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 拡張機能を作成して簡単にします。
XSL 拡張機能の詳細については、Jens Mikkelsen によるこの記事を参照してください。

于 2013-08-22T15:23:30.830 に答える