获取Sitecore模板A或模板B下的所有子项

时间:2015-02-27 20:53:03

标签: templates sitecore

有没有办法在两个模板下定位所有子页面?如同,如果模板名称是" A"或者,如果模板名称为" B",请让孩子们?

这就是我所拥有的,它现在只针对一个模板,但我想添加一些或者它,以便我可以获得另一个的子项:

    Item ContentGroup = CurrentItem.Axes.SelectSingleItem(@"child::*[@@templatename='Section Page']/*[@@templatename='Sub Page Top Level']");

我去了所有子项目的模板名称"子页面顶层"或者"子页面顶级自定义。"有没有办法在没有太多麻烦的情况下做到这一点?

3 个答案:

答案 0 :(得分:5)

您可以使用or之类的逻辑运算符:

/*[@@templatename='Sub Page Top Level' or @@templatename='Sub Page Top Level Custom']

答案 1 :(得分:3)

如果您使用Linq,可以使用:

homeItem.Axes.GetDescendants().Where(x =>(x.TemplateID.ToString().Equals(yourId1) || x.TemplateID.ToString().Equals(yourId2));

您还可以使用Sitecore XPath Builder评估您的sitecore查询:   要根据2个模板获取主项目下的所有项目,请使用:

/sitecore/content/home//*[@@templateid='{76036F5E-CBCE-46D1-AF0A-4143F9B557AA}' or @@templateid='{075AB719-9D9C-4ED0-9100-545E87D830A0}' ]

我建议你使用templateid而不是templatename。几年前我做了一些测试,使用templateid

的查询要快得多

答案 2 :(得分:0)

我知道这篇文章几个月来一直处于非活动状态。

我首先要说的是我没有Sitecore专家,但由于我不得不面对这个问题,所以这就是我解决问题的方法。我想确保减少调用次数和调用数据库的大小,因为我的解决方案将存在于Azure中。

var path = rootItem.Paths.Path;

var query = String.Format("fast:{0}//*[@@templateid='{1}' or @@templateid='{2}']",
            path, CategoryItems.CategoryLandingPageTemplateId, CategoryItems.CategoryPageTemplateId);

var items = GetSitecoreDatabase().SelectItems(query);

如您所见,我使用了快速查询。这适用于直接子项,但您也可以修改查询以获取后代。如果您知道您的查询将返回1000个或更少的项目,这应该可以正常工作。否则,我会使用搜索引擎(Lucene或Solr)来获取这些项目。