【问题标题】:Get ancestor at certain level in hierarchy using XPath / Sitecore Query使用 XPath / Sitecore Query 获取层次结构中某个级别的祖先
【发布时间】:2014-10-01 06:13:59
【问题描述】:

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

这些似乎可行,但不够灵活且很老套:

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

【问题讨论】:

  • 尽可能多地提出问题固然很好,但也有一个平衡点 - 请尽量避免进行过多的小修改。

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


【解决方案1】:

试试这个:

//contextItem/ancestor::*[3]/name()

【讨论】:

  • 谢谢。这似乎在 XPath 2.0 中有效,但在 1.0 中无效。不幸的是,它在 Sitecore 7.2 中也不起作用,我需要使用这个查询(不是你的错)。感谢您的帮助。
【解决方案2】:

您希望将&lt;target&gt; 元素给定为&lt;contextItem&gt; 作为当前上下文元素。我想知道为什么不:

./ancestor::target

【讨论】:

  • 我不确定它会叫什么。我将使用该信息更新问题。谢谢你的回答。
  • @lucounu ./ancestor::*[parent::content] 怎么样?
  • 这看起来不错...我猜甚至可以从那里限制一个内部 [parent::sitecore],并为任何级别的孩子添加一些东西。我会试一试。很好的建议,谢谢!
  • 当然,./ancestor::*[parent::content[parent::sitecore]] 应该可以工作
  • 由于某种原因它没有,我将其归结为这个 XPath-lite 实现的脆弱性。再次非常感谢。
【解决方案3】:

如果您可以将其作为下一个 target 元素,那么:

ancestor::target

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

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

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

ancestor::*[../.. = /]

【讨论】:

  • 这些都是很好的建议,我从他们那里学到了东西。不幸的是,这是一个名为“Sitecore Query”的 XPath 的调整版本,它们不能直接工作,尽管我一直在尝试调整它们并觉得它们可以通过调整来工作。没有可用的 name()(取而代之的是一个名为 @@name/@@key 的函数,它不带参数),并且最后的语法也不被接受。
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

    我找到了一个有效的查询:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-17
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多