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
是否存在用于union的XPath表达式?_Xpath_Union_Expression_Dry - Fatal编程技术网

是否存在用于union的XPath表达式?

是否存在用于union的XPath表达式?,xpath,union,expression,dry,Xpath,Union,Expression,Dry,这对于查找类似按钮的HTML元素非常有效(特意简化): 现在我需要将其约束到上下文中。例如,出现在带标签的框中的“购买”按钮: //legend[text()='Flubber'] 这是有效的,(…让我们进入包含字段集): 但有什么办法可以简化这一点吗?遗憾的是,这类事情不起作用: //legend[text()='Flubber']/..//( button[text()='Buy'] | input[@type='submit' and @value='Buy'] | a/img[@t

这对于查找类似按钮的HTML元素非常有效(特意简化):

现在我需要将其约束到上下文中。例如,出现在带标签的框中的“购买”按钮:

//legend[text()='Flubber']
这是有效的,(…让我们进入包含字段集):

但有什么办法可以简化这一点吗?遗憾的是,这类事情不起作用:

//legend[text()='Flubber']/..//(
  button[text()='Buy']
| input[@type='submit' and @value='Buy']
| a/img[@title='Buy'])

(请注意,这是针对浏览器中的XPath,因此XSLT解决方案没有帮助。)

将多个条件组合到一个谓词中:

//legend[text()='Flubber']/..//*[self::button[text()='Buy'] or 
                                 self::input[@type='submit' and @value='Buy'] or
                                 self::img[@title='Buy'][parent::a]]
英文:

选择父对象(或父对象本身)的所有子对象 对于任何具有 文本“Flubber”是一个
按钮
具有文本“Buy”或2)an的元素
input
具有属性的元素
类型
其值为“提交”且 名为
value
的属性,其值为 “购买”或3)拥有 名为
title
并带有值的属性 属于“购买”,且其父项为
a
元素


来自评论:

稍微调整以获得A 而不是IMG:
self::a[img[@title='Buy']]
。(现在如果 只有“买”可以减少

使用此XPath 1.0表达式:

//legend[text() = 'Flubber']/..
   //*[
      self::button/text()
    | self::input[@type = 'submit']/@value
    | self::a/img/@title
    = 'Buy'
   ]
编辑:我没有看到父访问器。只有一个方向的其他方式:

//*[legend[text() = 'Flubber']]
   //*[
      self::button/text()
    | self::input[@type = 'submit']/@value
    | self::a/img/@title
    = 'Buy'
   ]

非常好。稍微调整以获得A,而不是IMG:self::A[IMG[@title='Buy']](现在如果“Buy”可以减少的话:)嗯,这比较了3个值的串联,在这个简化的示例中,这3个值应该是相互排斥的部分。有趣的是,我最初的问题是如何大量使用union运算符,而这种改进是对union的微妙使用。@Chris Noe:这是使用节点集比较(而不是“串联”)最后一个谓词中的那些相对路径由self互斥,因为它们都从self轴开始:它们将处理任何文档,无论是简单的还是复杂的。是的,这打开了一些新的视野。Thx!@Chris Noe:XPath 1.0函数具有隐式强制转换,因此节点集成为单例(第一个节点)然后使用
number()
string()
boolean()
进行强制转换。但是这些相对路径是独占的,所以应该没有问题。或者,您可以使用非独占表达式:
布尔(@value |@title |@alt)[normalize-space()='Buy'])
布尔(@value |@title | alt)[以()开头)='Buy'])
。使用条件指令,不需要启动
boolean()
。看起来,以示例开头的示例需要是:boolean((@value |@alt)[以(,'Buy')]开头,并且可以缩短为(@value |@alt)[以(,'Buy')]开头]
//legend[text() = 'Flubber']/..
   //*[
      self::button/text()
    | self::input[@type = 'submit']/@value
    | self::a/img/@title
    = 'Buy'
   ]
//*[legend[text() = 'Flubber']]
   //*[
      self::button/text()
    | self::input[@type = 'submit']/@value
    | self::a/img/@title
    = 'Buy'
   ]