Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 为什么xmlstarlet说没有“ends with”函数?_Xpath_Xmlstarlet - Fatal编程技术网

Xpath 为什么xmlstarlet说没有“ends with”函数?

Xpath 为什么xmlstarlet说没有“ends with”函数?,xpath,xmlstarlet,Xpath,Xmlstarlet,我使用从XML变更日志中提取变更集节点,其中viewName以v结尾 但是,xmlstarlet抱怨说ends with XPATH函数不存在: $ xmlstarlet sel -N x="http://www.liquibase.org/xml/ns/dbchangelog" -t -m \ "/x:databaseChangeLog/x:changeSet[x:createView[ends-with(@viewName, 'v')]]" \ -c . public.db.changelo

我使用从XML变更日志中提取变更集节点,其中viewName以v结尾

但是,xmlstarlet抱怨说ends with XPATH函数不存在:

$ xmlstarlet sel -N x="http://www.liquibase.org/xml/ns/dbchangelog" -t -m \
"/x:databaseChangeLog/x:changeSet[x:createView[ends-with(@viewName, 'v')]]" \
-c . public.db.changelog.xml

xmlXPathCompOpEval: function ends-with not found
Unregistered function
Stack usage errror
xmlXPathCompiledEval: 3 objects left on the stack.
runtime error: element for-each
Failed to evaluate the 'select' expression.
None of the XPaths matched; to match a node in the default namespace
use '_' as the prefix (see section 5.1 in the manual).
For instance, use /_:node instead of /node
XML看起来有点像这样:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
  <changeSet id="1391529990457-3">
    <createView viewName="myviewnamev"><!-- view definition here --></createView>
  </changeSet>
  <changeSet id="1391529990457-4">
    <createView viewName="anotherviewname"><!-- view definition here --></createView>
  </changeSet>
</databaseChangeLog>
我知道XPATH表达式在其他方面是正确的,因为如果我将选择条件更改为x:createView[@viewName=myviewnamev],那么它将正确地只选择那个changeLog条目

如何让xmlstarlet正确使用ends with?或者,有没有其他方法来完成我想做的事情?

xmlstarlet只支持XPath 1.0,它不提供以$string结尾的$token函数。您需要使用子字符串、字符串长度和字符串比较来使用此模式构建自己的字符串:

substring($string, string-length($string) - string-length($token) + 1) = $token]
应用于您的查询,它应该如下所示:我预先计算了字符串长度:

/x:databaseChangeLog/x:changeSet[x:createView[
  substring(@viewName, string-length(@viewName)) = 'v']
]
或者,您可能需要寻找更强大的XPath 2.0/XQuery引擎。

xmlstarlet只支持XPath 1.0,它不提供ends with$string,$token函数。您需要使用子字符串、字符串长度和字符串比较来使用此模式构建自己的字符串:

substring($string, string-length($string) - string-length($token) + 1) = $token]
应用于您的查询,它应该如下所示:我预先计算了字符串长度:

/x:databaseChangeLog/x:changeSet[x:createView[
  substring(@viewName, string-length(@viewName)) = 'v']
]

或者,您可能需要寻找一个更强大的XPath 2.0/XQuery引擎。

您在哪里看到了?@O.R.Mapper右侧的函数结尾,但Jens下面的回答澄清了xmlstarlet不支持XPath 2.0。您在哪里看到了?@O.R.Mapper右侧的函数结尾,但Jens下面的回答澄清了xmlstarlet不支持XPath 2.0支持XPath2.0。谢谢!因为这是一个一次性的解决方案,这将是伟大的。谢谢!因为它是一次性的,所以这个解决方案会很好。