当前位置: 首页 > 面试题库 >

Xpath错误,not()和end-with()

封德华
2023-03-14
问题内容

我有以下Xpath表达式:

//*[not(input)][ends-with(@*, 'Copyright')]

我希望它能给我所有元素(输入除外),并带有以“版权”结尾的任何属性值。

我在Selenium 2 Java
API中执行它,webDriver.findElements(By.xpath(expression))并得到以下错误:

该表达方式不是合法的表达方式

但是这些表达式可以正常工作:

//*[not(input)][starts-with(@*, 'Copyright')]
//*[ends-with(@*, 'Copyright')]

有任何想法吗?


问题答案:

我有以下Xpath表达式:

//*[not(input)][ends-with(@*, 'Copyright')]

我希望它能给我所有元素(输入除外),并带有以“版权”结尾的任何属性值。

这里有一些问题

  1. ends-with()仅是标准的XPath 2.0函数,因此您可能正在使用XPath 1.0引擎,并且由于它不知道称为的函数,因此它会正确引发错误ends-with()

  2. 即使您使用的是XPath 2.0处理器,ends-with(@*, 'Copyright')在一般情况下该表达式也会导致错误,因为该ends-with()函数被定义为最多接受单个字符串xs:string?)作为其两个操作数-但是@*会产生一个以上字符串的序列在元素具有多个属性的情况下。

  3. //*[not(input)]并不是说“选择所有未命名的元素input。真正的含义是:”选择没有子元素“ input”的所有元素。

解决方案

  1. 使用此XPath 2.0表达式: //*[not(self::input)][@*[ends-with(.,'Copyright')]]

  2. 对于XPath 1.0,请使用以下表达式:

....

  //*[not(self::input)]
        [@*[substring(., string-length() -8) = 'Copyright']]

这是使用XSLT对最后一个XPath表达式进行的简短完整的验证:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:copy-of select=
     "//*[not(self::input)]
           [@*[substring(., string-length() -8)
              = 'Copyright'
              ]
          ]"/>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下XML文档时:

<html>
 <input/>
 <a x="Copyright not"/>
 <a y="This is a Copyright"/>
</html>

产生想要的正确结果

<a y="This is a Copyright"/>

如果XML文档位于默认名称空间中

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://www.w3.org/1999/xhtml"
 >
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:copy-of select=
     "//*[not(self::x:input)]
           [@*[substring(., string-length() -8)
              = 'Copyright'
              ]
          ]"/>
 </xsl:template>
</xsl:stylesheet>

当应用于此XML文档时

<html xmlns="http://www.w3.org/1999/xhtml">
 <input z="This is a Copyright"/>
 <a x="Copyright not"/>
 <a y="This is a Copyright"/>
</html>

所需的正确结果产生了:

<a xmlns="http://www.w3.org/1999/xhtml" y="This is a Copyright"/>


 类似资料:
  • 我尝试获取标题中包含一些单词的链接,但不包含一些单词,我使用以下代码,但它表示这不是有效的XPath表达式。 请在此处找到我的代码: 任何帮助将不胜感激!

  • 这是我正在开发的wordpress插件的代码。 我是插件开发新手,不知道为什么会出现这样的错误:

  • 本文向大家介绍解决IDEA Gradle构建报错'Cause: zip END header not found',包括了解决IDEA Gradle构建报错'Cause: zip END header not found'的使用技巧和注意事项,需要的朋友参考一下 1 问题描述 某天使用 Gradle 构建项目时, IDEA 报错如下: 2 原因 原因是下载的 Gradle ,也就是 zip 压缩包

  • (假设哈希已经完成)我正在尝试通过比较输入的密码和MongoDB集合中的哈希来执行用户身份验证功能。这是my model.js中的方法(复制自bcrypt指南): 和我的Controller.js: 并且当我获取check方法时,节点控制台会提示我的model.js中的cb不是函数的错误。我试过几种变通办法,但到目前为止没有一种奏效。有什么办法可以调试这个吗?

  • 我试图提取所有这些标签,其类名符合正则表达式模式frag-0-0,frag-1-0等,从这个输入链接描述在这里 我正在尝试以下代码 这是我的回溯: 回溯(最近一次调用):文件“/home/ubuntu/workspace/vroniplag/vroni.py”,第116行,在op('Aaf')文件“/home/ubuntu/workspace/vroniplag/vroni.py”中,第101行,

  • 我寻找答案,发现缺少引号或括号会导致这个错误。我检查了几次,并添加了丢失的引号,但第91行在底部,所以我无法找出它,除非它是“< code>else:”我从上到下看了看,但我不确定哪个会导致错误。请借给我你的眼睛找到问题。谢谢你