使用XPath / Sitecore Query在层次结构中获取特定级别的祖先

时间:2014-09-29 10:20:16

标签: xml xpath sitecore xpath-1.0 sitecore7.2

当从任何深度的类似“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]

5 个答案:

答案 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的子级,这就是我所追求的。

我将有兴趣了解更好的方法。