我可以通过重构来避免 "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>
我要检索四个元素:
<pre><code>foo</code></pre>
<code>bar</code>
<pre>baz</pre>
<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))]
我想提取 //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>
我要检索四个元素:
<pre><code>foo</code></pre>
<code>bar</code>
<pre>baz</pre>
<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
相反。)
所以,简而言之,除了像
你所拥有的似乎是使用 self::
和 pre::
的一个很好的理由。如果没有它们,我认为没有更好的表达方式。
但是请注意,您的条件的操作数多于所需。你可以这样表达同样的事情:
//*[self::pre or (self::code and not(parent::pre))]