【问题标题】:Xpath substring-before gets only one elementXpath substring-before 只获取一个元素
【发布时间】:2012-06-05 22:04:55
【问题描述】:
<row transactionDateTime="2012-06-04 02:42:44" transactionID="2519826732" quantity="5000" typeName="Caldari Navy Mjolnir Rocket" typeID="27321" price="988.72" clientID="92026367" clientName="N Clover" stationID="60003760" stationName="Jita IV - Moon 4 - Caldari Navy Assembly Plant" transactionType="buy" transactionFor="personal" journalTransactionID="5956192510"/>

你好,

以上是我尝试从中提取数据的 XML 文件的示例。我要提取的数据是;

transactionDateTime="2012-06-04"

现在 - 使用以下 Xpath 查询我没有问题;

substring-before(//row[@transactionfor='personal']/attribute::transactiondatetime, ' ')

这正是我想要的——“2012-06-04”,但它只给了我一个元素!如果我删除子字符串之前它会得到我所有的元素,但包括时间。

任何帮助都会很棒!

【问题讨论】:

    标签: xml xpath substring


    【解决方案1】:
    substring-before(//row[@transactionfor='personal']/attribute::transactiondatetime, ' ') 
    

    在 XPath 1.0 中,如果将节点集作为参数传递,其中需要单个值(字符串),则节点集中的第一个节点将用作参数。规则是将函数 string() 应用于传递的节点集,并且根据定义 string($nodeset)string($node-set[1]) 相同。

    在 XPath 2.0 中,上述表达式会导致错误。

    当节点数大于 1 时,单个 XPath 表达式无法生成应用于所有选定节点的函数结果

    因此,必须在第二步中处理每个选定的节点(可能在托管 XPath 的编程语言中指定的循环中)。

    在 XPath 2.0 中,可以使用函数调用作为表达式的最后定位步骤

    因此,可以使用此 XPath 2.0 表达式生成所有想要的字符串序列:

    //row[@transactionfor='personal']
               /attribute::transactiondatetime
                               /substring-before(., ' ') 
    

    【讨论】:

    • 嗨 Dimitre,我真的开始认为这是 Google 电子表格的问题。我使用了您提供的表达式,但出现以下错误:错误:无法评估给定的 xPath 查询。请检查查询的语法: //row[@transactionfor='personal']/attribute::transactiondatetime/substring-before(.,' ') 如您所见,它本质上是复制/粘贴,但仍然如此不行。我可以看到您的巨大声誉和对问题的非常扎实的描述,所以我的假设是您的语法正确,但 Google 电子表格存在一些问题。
    • 还有,最上面的表达式; substring-before(//row[@transactionfor='personal']/attribute::transactiondatetime, ' ') 没有给出错误,而是返回了一个值。我相信您说过这会导致错误,因为我告诉它“当节点数大于 1 时,生成应用于所有选定节点的函数的结果”。但是,它没有给出错误。它只是返回一个值,其余的什么都不做。
    • 另外,我很抱歉我的帖子中缺少格式。我不知道为什么,但我这辈子都无法让断线工作。
    • @Flynn1179:??????我对您上次的评论一无所知 - 请您详细说明一下?
    • @Flynn1179:哦,我明白了...... :) 即使在这种情况下,声明也是正确的 :) 恭喜,你是唯一注意到这一点的人。
    【解决方案2】:

    它不起作用,因为substring-before() 的第一个参数是一个字符串,而您将所有行的transactionDateTime 属性传递给它。

    试试这个:

    //row[@transactionFor='personal']/substring-before(@transactionDateTime,' ')
    

    【讨论】:

    • 尝试了复制/粘贴,但我收到了无法完成 xPath 查询的错误。请检查语法并重试。我也试过; //row/substring-before([@transactionfor='personal']/attribute::transactiondatetime, ' ')
    • @user1438413 - 在 oXygen 中对我来说效果很好。你用的是什么处理器?试试这个://row/@transactionDateTime/substring-before(.,' ')
    • 我在学校的电脑上,但我在谷歌电子表格中使用它,所以这应该是无关紧要的。它仍然无法处理更改 - 同样的错误。
    • 可能是电子表格错误。我尝试创建另一个 importXML 函数,并得到一个错误,我需要检查文件 - 这是准确的。现在要回家了,会回来的!
    • 嘿,再次,似乎仍然无法正常工作,它给了我 ImportXML 函数的语法错误。
    猜你喜欢
    • 2014-11-30
    • 2022-08-17
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 2011-08-03
    • 2020-03-07
    相关资源
    最近更新 更多