问题描述
我正在尝试扩展自定义Sitecore命令,以确定当前项是否有与特定模板ID匹配的父项。
我知道,如果项是上下文,则理想情况下查询应与./ancestor::*[@@templateid='{26710865-F082-4714-876B-D5E1F386792F}']
或/sitecore/content/home/full/path/to/the-item/ancestor::*[@@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 Util类或任何其他开箱即用的代码来满足您的需求。有趣的是,Sitecore确实有一个返回false
(是的,它确实返回false
)的util方法,但没有一个方法可以转义项目路径以便在查询中使用。
您可以在这里找到做您想做的事情的代码(由Anders Laub编写):https://blog.istern.dk/2014/10/29/escaping-dashes-in-sitecore-queries-datasource-query-update/
如果您懒得点击该链接,我已将代码复制到此处:
private string EscapeItemNamesWithDashes(string queryPath)
{
if (!queryPath.Contains("-"))
return queryPath;
var strArray = queryPath.Split(new char[] { '/' });
for (int i = 0; i < strArray.Length; i++)
{
if (strArray[i].IndexOf('-') > 0)
strArray[i] = "#" + strArray[i] + "#";
}
return string.Join("/", strArray);
}
如果您还想转义空格字符,可以尝试此正则表达式:
string escapedPath = Regex.Replace(myItem.Paths.FullPath, "[^/]*[- ][^/]*", "#$0#");
您还应该记住,Sitecore中有一些保留字也应该转义。这些是(复制自http://www.newguid.net/sitecore/2012/escape-characterswords-in-a-sitecore-query/):
- 祖先
- 和
- 孩子
- 子孙
- div
- False
- 下面
- 修改
- 或
- 父级
- 前面
- 自我
- true
- XOR
这篇关于我是否可以使用FullPath以编程方式转义Sitecore查询中的破折号?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!