当从任何深度的类似“contextItem”元素执行时,如何编写相对Sitecore查询(XPath的松散版本)查询以仅返回下面的元素“target”(即第三深度祖先)?由于我正在执行查询的上下文,它必须是相对于“contextItem”(或任何元素将是查询的上下文)。
此外,我不知道我需要选择的项目的名称,只是级别和它是一个祖先(以及它将始终显示在/ sitecore / content下)。
执行上下文是Sitecore 7.2,查询将用于选择/ sitecore / content下的祖先。谢谢。
<sitecore>
<content>
<target>
<level>
<level>
<contextItem>
</contextItem>
</level>
</level>
</target>
<target2>
<otherStuff/>
</target2>
</content>
<system>
<stuff/>
</system>
<templates>
<otherStuff/>
</templates>
</sitecore>
以下Sitecore查询选择我成功完成后的项目,以及它与上下文项目之间的所有介入祖先:
./ancestor::*[ancestor::*[@@key='content']]
这些似乎有效,但是不灵活和黑客:
./ancestor::*[@@key='home']/ancestor::*[@@key != 'sitecore' and @@key != 'content']
./ancestor::*[position() = 1 and @@key != 'sitecore' and @@key != 'content']
编辑:这些也有效:
./ancestor::*[ancestor::*[@@key='content']]/.[1]
./ancestor::*[ancestor::*[parent::content]]/.[1]
答案 0 :(得分:1)
试试这个:
//contextItem/ancestor::*[3]/name()
答案 1 :(得分:1)
您希望将<target>
元素<contextItem>
作为当前上下文元素。我想知道为什么不:
./ancestor::target
答案 2 :(得分:1)
如果你可以依赖它作为下一个target
元素,那么:
ancestor::target
否则,如果仅调用根元素sitecore
,则:
ancestor::target[name(../..) = "sitecore"]
如果除了嵌套级别之外无法识别该元素:
ancestor::*[../.. = /]
答案 3 :(得分:1)
&#34;目标&#34;特定模板类型?如果没有,也许你应该做到,然后你可以简单地使用:
./ancestor-or-self::*[@@templateid = '{GUID}']
当然,这取决于你的内容结构,但是使用插入选项和限制因此它只能在某个级别创建(或者编写你的其他代码,这样你就不关心它在哪个级别)
答案 4 :(得分:0)
我发现了一个有效的查询:
./ancestor::*[ancestor::*[@@key='content']]/.[1]
显然,如果您的某个项目的键位为&#34; content&#34;在层次结构中比在第二层更深;例如,您可以将@@ id与/ sitecore / content项的GUID一起使用。
Sitecore中基于XPath索引的查询有点时髦 - 使用索引1似乎经常返回前三项(/ sitecore,/ sitecore / Content和/ sitecore / Content / whatever) 。使用上面基于索引的查询格式将返回指定级别加上两个的项目 - 因此在这种情况下,它将返回第三个祖先,/ sitecore / Content的子级,这就是我所追求的。
我将有兴趣了解更好的方法。