1

当从任何深度的类似“contextItem”元素执行时,如何编写相对 Sitecore 查询(XPath 的松散版本)查询以仅返回下面的元素“目标”(即第三深祖先)?由于我正在执行查询的上下文,它必须相对于“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']]

这些似乎工作,但不灵活和hacky:

./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]
4

5 回答 5

1

您想要获取作为当前上下文元素<target>给出的元素。<contextItem>我想知道为什么不:

./ancestor::target
于 2014-09-29T12:53:39.543 回答
1

如果您可以依靠它作为下一个target元素,那么:

ancestor::target

否则,如果只调用根元素sitecore,则:

ancestor::target[name(../..) = "sitecore"]

如果除了嵌套级别之外无法识别该元素:

ancestor::*[../.. = /]
于 2014-09-29T12:54:11.563 回答
1

“目标”是特定模板类型吗?如果不是,也许你应该做到,然后你可以简单地使用:

./ancestor-or-self::*[@@templateid = '{GUID}']

当然,这取决于您的内容结构,但使用插入选项和限制,因此它只能在某个级别创建(或编写您的其他代码,所以您不在乎它在哪个级别)

于 2014-09-30T11:00:07.567 回答
1

试试这个:

//contextItem/ancestor::*[3]/name()
于 2014-09-29T10:26:02.753 回答
0

我发现了一个有效的查询:

./ancestor::*[ancestor::*[@@key='content']]/.[1]

显然,如果您的层次结构中的“内容”键比第二级更深,您会进行调整;例如,您可以将 @@id 与 /sitecore/content 项目的 GUID 一起使用。

Sitecore 中基于 XPath 索引的查询有点奇怪——使用索引 1 似乎经常返回前三个项目(/sitecore、/sitecore/Content 和 /sitecore/Content/whatever)。使用上面的基于索引的查询格式将返回指定级别的项目加二——所以在这种情况下,它将返回第三个祖先,即 /sitecore/Content 的子项,这就是我所追求的。

我将有兴趣学习一种更好的方法。

于 2014-09-29T20:09:39.287 回答