我可以通过重构来避免 "self::" 和 "parent::" 吗?

Can I refactor to avoid "self::" and "parent::"?

我想提取 //pre//code 元素但排除 //pre/code。例如:

<root>
    <pre><code>foo</code></pre>
    <code>bar</code>
    <pre>baz</pre>
    <span>ignore me<code>select me</code></span>
</root>

我要检索四个元素:

  1. <pre><code>foo</code></pre>
  2. <code>bar</code>
  3. <pre>baz</pre>
  4. <code>select me</code>

(我特别不想<code>foo</code>

以下 xpath 似乎可以解决问题:

//*[(self::pre or self::code) and not (self::code and parent::pre)]

我不知道这是否是正确的方法,但它似乎有效。

是否有更简洁的表达方式(例如,不需要 self::parent::)?

试图消除 self::parent:: 总体上并不是一个值得称赞的目标。您可能正在搜索这些坐标轴的缩写,希望它们能提供一种缩短的等效表达形式。

这是可以理解的,例如,子轴,

/child::a/child:b

可以写得更简洁

/a/b

self::parent::的并列缩写是什么?

  • self::node()可以简写.
  • parent::node()可以简写..

但是,这些在上下文节点的名称或其父节点的名称不重要的情况下更有用 - 在您的情况下并非如此。 (例如,./ 用于相对路径,而 / 用于绝对路径;../@attr 用于引用父元素的 attr 属性与上下文元素的 @attr 相反。)

所以,简而言之,除了像 这样的逻辑简化之外,您的 XPath 已经相当简单了。轴缩写不会有太大帮助。

你所拥有的似乎是使用 self::pre:: 的一个很好的理由。如果没有它们,我认为没有更好的表达方式。

但是请注意,您的条件的操作数多于所需。你可以这样表达同样的事情:

//*[self::pre or (self::code and not(parent::pre))]