我可以使用FullPath以编程方式逃避Sitecore查询中的破折号吗?

我正在尝试扩展自定义Sitecore命令以确定当前项目是否具有与特定模板ID匹配的父项目.

我知道查询理想上应该像./ancestor ::: [@@templateid ='{26710865-F082-4714-876B-D5E1F386792F}’]一样简单,如果项目是上下文,或/ sitecore / content / home /全/路径/到/在项/祖先:: * [@@ templateid = ‘{26710865-F082-4714-876B-D5E1F386792F}’]

不幸的是,项目路径包括需要转义的破折号,如/ sitecore / content / home / full / path / to / #the-item#/ ancestor :: * [@@ templateid ='{26710865-F082-4714-876B- D5E1F386792F}“.

但是,理想情况下我只想使用项目的完整路径,因为它可以作为item.Paths.FullPath使用.

给定一个项目,编写包含它的完整路径的查询以及转义可能包含在内的任何破折号的最佳方法是什么?

假设

假设您有一个Sitecore.Data.Items.Item(称为item)的引用,并且您希望找到具有给定Sitecore.Data.ID(称为id)的祖先,您可以通过多种方式访问​​祖先.

使用Linq

在没有任何自定义库的典型Sitecore设置中,我通常会使用一些Linq,以避免XPath中的编码问题.

ancestor =
    item
        .Axes
        .GetAncestors()
        .FirstOrDefault(ancestor => ancestor.TemplateID == id);

使用最近

我使用定制的Sitecore开发框架,涉及各种扩展方法和自定义项目生成.为了避免在过滤之前访问所有祖先的开销,我会使用Closest扩展方法:

public static Item Closest(this Item source, Func<Item, bool> test)
{
    Item cur;
    for (cur = source; cur != null; cur = cur.Parent)
    if (test(cur))
        break;
    return cur;
}

访问祖先将是:

ancestor =
    item
        .Closest(ancestor => ancestor.TemplateID == id);

(实际上,我通常使用看起来像的代码)

ancestor = (ITemplateNameItem) item.Closest(Is.Type<ITemplateNameItem>);

使用XPath

我通常会避免使用XPath并且仅将其用作最后的工具,因为它经常使代码难以阅读,引入编码问题,例如您在此问题中遇到的问题,并且对项目数量有严格限制可以退货.

也就是说,Sitecore有许多可用于使用XPath进行搜索的工具,在某些情况下它确实简化了操作.

修复包含空格的项目路径的技巧是:不要使用项目路径.

相反,您可以安全地使用项目的ID,不需要更多上下文,因为它是对项目的绝对引用.它也保证遵循特定的格式.

var query =
    string.Format(
        "//{0}/ancestor::*[@@templateid='{1}']",
        item.ID.ToString(),
        id.ToString());
/* alternatively
var query =
    string.Format(
        "{0}/ancestor::*[@@templateid='{1}']",
        item.Paths.LongID,
        id.ToString());
*/
ancestor =
    item
        .Database
        .SelectSingleItem(query);

使用Sitecore.Data.Query.Query

正如我之前提到的,Sitecore有许多工具可用于使用XPath进行搜索.其中一个工具是Sitecore.Data.Query.Query. SelectItems和SelectSingleItem方法具有其他可选参数,其中一个是Sitecore.Data.Items.Item作为contextNode.

将项目作为第二个参数传递使用该项目作为XPath查询的上下文.

var query =
    string.Format(
        "./ancestor::*[@@templateid='{0}']",
        id.ToString());
ancestor =
    Sitecore
        .Data
        .Query
        .Query
        .SelectSingleItem(query, item);
相关文章
相关标签/搜索