<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Foo</groupId>
<artifactId>Bar</artifactId>
<version>9.9.9</version>
</project>
我正在尝试使用 xmlstarlet 编辑版本值,但是我在想出指向该节点的 XPath 时遇到了麻烦,因为父节点有多个属性,我似乎无法绕过它。
我尝试了以下方法,但是我得到无效的表达式错误:
xmlstarlet ed --omit-decl -L -u "/project[@xmlns=http://maven.apache.org/POM/4.0.0 and @xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance and @xsi:schemaLocation=http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd]/version" -v 10.10.10 ./file.xml
xmlns
属性是命名空间定义。没有冒号的那个定义默认命名空间。XPath 不支持默认命名空间,因此必须显式引用它。最新版本的 XMLStarlet (1.5.0+) 将默认命名空间绑定到"_",以便您可以执行以下操作:
xmlstarlet ed --omit-decl -L -u "/_:project/_:version" -v 10.10.10 ./file.xml
您可以像这样显式绑定命名空间:
xmlstarlet ed -N pom=http://maven.apache.org/POM/4.0.0 --omit-decl -L -u "/pom:project/pom:version" -v 10.10.10 ./file.xml
另请参阅手册第 5.1 节。
尝试将所有属性值括在单引号内:
"/project[@xmlns='http://maven.apache.org/POM/4.0.0' and @xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' and @xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd']/version"