【问题标题】:xpath ends-with text not a valid XPath expressionxpath 以文本结尾不是有效的 XPath 表达式
【发布时间】:2022-10-03 08:41:45
【问题描述】:

我试图获取内部文本以A new payment 开头并以was created 结尾的元素。

<span>A new payment pi_123432 for $40.03 USD was created</span>
var xpath = \"//span[starts-with(text(), \'A new payment\') and ends-with(text(), \'was created\')]\";
var matchingElement = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

我收到not a valid XPath expression

Uncaught DOMException: Failed to execute \'evaluate\' on \'Document\': The string \'//span[starts-with(text(), \'A new payment\') and ends-with(text(), \'was created\')]\' is not a valid XPath expression.

当我分解它时,这个 xpath 有效:

var xpath = \"//span[starts-with(text(), \'A new payment\')]\";

但是这个 xpath 抛出了同样的错误

var xpath = \"//span[ends-with(text(), \'was created\')]\"

但我说不出为什么。

我在铬上。

标签: javascript html xpath xpath-2.0 xpath-1.0


【解决方案1】:

ends-with 仅在 Xpath 2.0 中,chrome 使用 Xpath 1.0

Xpath 1.0

var xpath = "//span[starts-with(text(), 'A new payment') and substring(text(), string-length(text()) - string-length('was created') + 1)  = 'was created']";

【讨论】:

    【解决方案2】:

    使用 SaxonJS 2 和 XPath 3.1:

    var xpath = "//span[starts-with(., 'A new payment') and ends-with(., 'was created')]";
    var matchingElements = SaxonJS.XPath.evaluate(xpath, document, { xpathDefaultNamespace : 'http://www.w3.org/1999/xhtml' });
    
    console.log(matchingElements);
    <script src="https://martin-honnen.github.io/Saxon-JS-2.4/SaxonJS2.rt.js"></script>
    
    <span>A new payment pi_123432 for $40.03 USD was created</span>

    另见download pagedocumentation of SaxonJS

    【讨论】:

      【解决方案3】:

      但是这个 xpath 抛出了同样的错误

      var xpath = "//span[ends-with(text(), 'was created')]"
      

      但我说不出为什么。

      fn:ends-with()第一次出现在XPath 2.0 specification.它不是标准的 XPath 1.0 函数。

      在 XPath 1.0 中找到 ends-with($s, $suffix) 的值使用

      substring($s, string-length($s) - string-length($suffix)) =  $suffix
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        • 2017-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多