Xml 我可以重构以避免;赛尔夫::“;及;家长::“;?
我想提取Xml 我可以重构以避免;赛尔夫::“;及;家长::“;?,xml,xpath,xpath-1.0,Xml,Xpath,Xpath 1.0,我想提取//pre和//code元素,但排除//pre/code。例如: <root> <pre><code>foo</code></pre> <code>bar</code> <pre>baz</pre> <span>ignore me<code>select me</code></span> </ro
//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>
bar
/child::a/child:b
我要检索四个元素:
bar
/child::a/child:b
我不知道这是否是正确的方法,但它似乎有效
是否有一种不那么冗长的方式来表达这一点(例如,不需要self:
和parent::
)?试图消除self:
和parent:
通常不是一个值得称赞的目标。您可能正在搜索这些轴的缩写,希望它们能够提供一种简化的等效表达形式
这是可以理解的,例如,子轴
可以写得更简洁
self::
和parent::
的平行缩写是什么
self::node()
可以缩写为
parent::node()
可以缩写为。
但是,在上下文节点或其父节点的名称无关紧要的情况下,这些更有用—在您的情况下并非如此。(例如,/
用于相对路径,而/
用于绝对路径;。/@attr
用于引用父元素的attr
属性,而不是上下文元素的@attr
。)
因此,简而言之,除了逻辑简化,您的XPath已经相当简单了。Axes缩写不会有多大帮助。您在那里拥有的似乎是使用self:
和pre:
的好理由。我认为没有他们没有更好的表达方式
但是,请注意,条件的操作数比需要的多。你可以这样表达同样的事情:
/*[(self::pre或self::code)
与(//pre union//code)
不一样吗?答案已更新,以反映(我希望)对问题本质的更好理解。非常感谢。您帮助我更清楚地理解了XPath表达式的实际含义。
/a/b
//*[self::pre or (self::code and not(parent::pre))]