如何在使用normalizespace和substring之前使用XPath获得元素的多次出现

如何在使用normalizespace和substring之前使用XPath获得元素的多次出现,xpath,Xpath,我有一个元素在页面上出现了三次。如果我将它与Xpath表达式//div[@class='col-md-9 col-xs-12']匹配,我将获得预期的所有三种情况 现在,我尝试使用 在(//div[@class='col-md-9 col-xs-12'],'Bewertungen')之前的子字符串,以获取单词“Bewertungen”之前的字符串 规范化空间(//div[@class='col-md-9 col-xs-12']),以清除多余的空白 规范化空间(在(//div[@class='col

我有一个元素在页面上出现了三次。如果我将它与Xpath表达式
//div[@class='col-md-9 col-xs-12']
匹配,我将获得预期的所有三种情况

现在,我尝试使用

  • 在(//div[@class='col-md-9 col-xs-12'],'Bewertungen')之前的子字符串
    ,以获取单词“Bewertungen”之前的字符串

  • 规范化空间(//div[@class='col-md-9 col-xs-12'])
    ,以清除多余的空白

  • 规范化空间(在(//div[@class='col-md-9 col-xs-12']之前的子字符串)
    -两个操作

  • 最后三个表达式的问题是,它们只提取元素的第一次出现的

    我不明白,在之前添加
    规范化空格
    和/或
    子字符串如何影响“main”表达式,使其停止识别目标元素的多个出现,并仅获取第一个。如果不添加,它将匹配所有内容

    如何调整Xpath表达式3以获得元素的所有出现


    示例url是问题在于
    normalize-space()
    substring-before()
    都具有所需的基数1,这意味着只能接受您尝试规范化的元素或查找其子字符串的元素的一次出现。您的每个表达式都会产生这两个函数无法处理的3个序列。(我可能没有正确地表达这个问题,但我认为这是总体思路)

    鉴于此,请尝试:

    //div[@class='col-md-9 col-xs-12']/substring-before(normalize-space(.), 'Bewertung')
    

    问题是
    normalize-space()
    substring-before()
    都具有所需的基数1,这意味着只能接受您尝试规范化的元素的一次出现或查找其子字符串。您的每个表达式都会产生这两个函数无法处理的3个序列。(我可能没有正确地表达这个问题,但我认为这是总体思路)

    鉴于此,请尝试:

    //div[@class='col-md-9 col-xs-12']/substring-before(normalize-space(.), 'Bewertung')
    

    请注意,在XPath 1.0中,类似于
    substring-after()
    的函数,如果给定一组三个节点作为输入,则忽略除第一个节点以外的所有节点。XPath 2.0更改了这一点:它会给您一个错误

    在XPath 3.1中,可以使用apply运算符“!”:
    //div[condition]!substring before(normalize-space(),'Bewertung')
    将函数应用于每个节点。它返回一个由3个字符串组成的序列。XPath 1.0中没有等效的函数,因为XPath 1.0中没有可以表示字符串序列的数据类型

    在XPath2.0中,通常可以使用“/”而不是“!”来实现相同的效果,但它有一些限制


    在询问有关StackOverflow的问题时,请始终提及您使用的XPath版本。我们倾向于假设,如果人们不说,他们可能正在使用1.0,因为1.0产品通常不会公布其版本号。

    注意,在XPath 1.0中,类似
    substring-after()的函数
    ,如果给定一组三个节点作为输入,则忽略除第一个节点以外的所有节点。XPath 2.0更改了这一点:它会给您一个错误

    在XPath 3.1中,可以使用apply运算符“!”:
    //div[condition]!substring before(normalize-space(),'Bewertung')
    将函数应用于每个节点。它返回一个由3个字符串组成的序列。XPath 1.0中没有等效的函数,因为XPath 1.0中没有可以表示字符串序列的数据类型

    在XPath2.0中,通常可以使用“/”而不是“!”来实现相同的效果,但它有一些限制


    在询问有关StackOverflow的问题时,请始终提及您使用的XPath版本。我们倾向于假设,如果人们不说,他们可能正在使用1.0,因为1.0产品通常不会宣传其版本号。

    看起来,它应该可以工作,但对我不起作用……我在一种环境中使用它,在这种环境中Java风格的Xpath正在使用中-我无法通过验证获得此表达式。您能想象如何调整此表达式的语法吗?这就是问题所在-我只收到一条由环境触发的错误消息,如“invalid expression”。一般来说,有Java风格的Xpath 1.0。我明白了;所以它不会告诉您表达式是Xpath无效还是Java无效?这显然有区别……这个环境有自己的语法验证引擎。看起来它只是不理解表达式。如果我将表达式修改为
    //div[@class='col-md-9 col-xs-12'][substring before(normalize space(.),'Bewertung')]-它变得有效,但显然不起作用…
    测试其他东西我意识到它在语法部分有问题
    (normalize space(.)
    不幸的是,这似乎是xpath 1.0 vs 2.0的问题。正如Michael Kay所提到的,这个表达式使用了
    /
    路径运算符,这种方式只能从xpath 2.0中获得。请看。它看起来应该可以工作,但对我来说不起作用……我在某种环境中使用它,在这种环境中使用Java风格的xpath,而我无法得到它他的表达式通过验证。你能想象这个表达式的语法是如何调整的吗?这就是问题所在-我只收到一条由环境触发的错误消息,比如“invalid expression”。一般来说,有Java风格的Xpath 1.0。我明白了;所以它不会告诉您表达式是Xpath无效还是Java无效?这显然有区别……这个环境有自己的语法验证引擎。看起来它只是不理解表达式。如果我将表达式修改为
    //div[@class='col-md-9 col-xs-12'][substring before(normalize space(.),'Bewertung')]-它变为有效,但显然不起作用…
    测试我意识到它的其他功能