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>

这显示了来自所选项目的每个祖先的“主要信息”。

我怎样才能只获得一个“主要信息”?如果此字段不为空,则来自所选项目,或者来自填充了“主要信息”的第一个父项目。

4

2 回答 2

2

我真的相信这说明了为什么您应该考虑用 C# 编写组件,而不是浪费时间尝试通过 XSLT 来“破解”解决方案。当然,如果您愿意,您可以编写自己的扩展 - 但让我们考虑一下这将是多么少的代码开始。

在您的 .ASCX 文件中,您将拥有:

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

在您的 .cs 代码隐藏/代码旁:

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 扩展来简化它。您可以在Jens Mikkelsen的这篇文章
中阅读有关 XSL 扩展的更多信息。

于 2013-08-22T15:23:30.830 回答