Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 我可以重构以避免;赛尔夫::“;及;家长::“;?_Xml_Xpath_Xpath 1.0 - Fatal编程技术网

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))]