代码之家  ›  专栏  ›  技术社区  ›  foudfou

xpath“或”与xmllib2的行为类似于并集(“|”)

  •  6
  • foudfou  · 技术社区  · 14 年前

    我有如下XML文档:

    <rootelement>
    <myelement>test1</myelement>
    <myelement>test2</myelement>
    <myelement type='specific'>test3</myelement>
    </rootelement>
    

    myelement ,和 如果 它不存在, 然后

    /rootelement/myelement[@type='specific' or position()=1]
    

    这个 XPath spec

    右操作数不求值,如果 左操作数的计算结果为true

    xmllint --shell

    2 回复  |  直到 14 年前
        1
  •  11
  •   Matt Ball    14 年前


    这个 or 操作人员 工会。

    您引用的规范部分(“未计算正确的操作数…”)是标准的一部分 boolean logic short circuiting

    这就是为什么要为示例输入设置一个2节点集:XPath查看每个 myelement 那是我的孩子 rootelement ,并应用 [@type='specific' or position()=1] 向每个这样的节点分配一部分,以确定它是否与选择器匹配。

    1. <myelement>test1</myelement> 不匹配 @type='specific' position()=1 ,因此它匹配整个选择器。
    2. <myelement>test2</myelement> @type='specific' ,它也不匹配 位置()=1
    3. <myelement type='specific'>test3</myelement> 比赛 @type='specific' (这样XPath就不必测试它的位置——这是短路部分)所以它匹配整个选择器。

    第一个和最后一个 <myelement>

    选择所需元素的最简单方法是分两步进行。下面是伪代码(我不知道您实际在什么上下文中使用XPath,而且我对编写XPath语法选择器不太熟悉):

    1. 选择 elements 那场比赛 /rootelement/myelement[@type='specific']
    2. 如果 元素 为空,请选择 那场比赛 /rootelement/myelement[position()=1]
        2
  •  8
  •   Matt Ball    12 年前

    @马特·鲍尔很好地解释了你问题的原因。

    这里有一个XPath一行程序,可以精确地选择您想要的内容 :

    /*/myelement[@type='specific'] | /*[not(myelement[@type='specific'])]/myelement[1]