【问题标题】:XPath: apply function to all matches?XPath:将函数应用于所有匹配项?
【发布时间】:2016-07-15 16:23:26
【问题描述】:

所以我有一个 XPath 表达式来获取我感兴趣的属性值:

//ElementName/@AttributeName

我只想要那个属性的值作为一个字符串。我可以这样做:

string(//ElementName/@AttributeName)

但这仅将函数应用于第一个节点。我想得到将 string() 应用于 all 的匹配结果,并连接在一起(我在命令行中使用xmllint,它只是打印出表达式的结果,所以它不需要是结构化类型的结果)。我认为这可能有效:

//ElementName/string(./@AttributeName)

但这给了我一个语法错误,就像我尝试的变体一样。所以目前,我正在这样做:

count=$(xmllint --xpath 'count(//ElementName/@AttributeName)' file.xml)
for (( i=1; i<=count; ++i )); do
   echo "$(xmllint --xpath "string((//ElementName/@AttributeName)[$i])" file.xml)"
done

这似乎……至少效率低下。有没有更好的办法?

【问题讨论】:

    标签: xpath


    【解决方案1】:

    使用 XPath 2.0(或 XQuery 1.0)及更高版本,您可以使用//ElementName/@AttributeName/string() 的方法来获取所有字符串值的序列,或者使用string-join(//ElementName/@AttributeName, '') 将它们连接在一起。但是在 XPath 1.0 中,您总是需要像以前那样转到宿主语言。

    【讨论】:

    • 看来libxmlxmllint 只是一个 CLI 接口)仍然只支持 XPath 1.0。好的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    相关资源
    最近更新 更多