这是我的test.xml文件:
<?xml version="1.0"?>
<path>
<dir name="directory">
<file name="file1"/>
<file name="file2"/>
</dir>
</path>
现在我可以在我的值之后添加一些文字:
xmlstarlet ed -s "//file[@name]/@name" -t text -n "@name" -v "_copy_" test.xml
结果:
…
<file name="file1_copy_"/>
<file name="file2_copy_"/>
…
如何在值之前添加文本?
…
<file name="_copy_file1"/>
<file name="_copy_file2"/>
…
答案 0 :(得分:4)
根据命令行帮助xmlstarlet ed
,您可以使用更新 -u
选项并包含替换XPath 表达式 {{ 1}}:
-x
在替换表达式中,您可以使用XPath xmlstarlet ed -u <xpath> -x <xpath>
函数生成将替换该属性的字符串。表达式concat()
将在当前节点之前连接字符串concat('_copy_',.)
,这是您选择的属性。你的表达应该是:
'_copy_'
答案 1 :(得分:2)
如果您愿意使用tr
的{{1}}命令,则可以使用以下帮助程序XSLT获取所需的结果xmlstarlet
convert.xslt
和电话
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="*|@*">
<xsl:copy>
<xsl:apply-templates select="*|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="file/@name">
<xsl:attribute name="name">
<xsl:value-of select="concat('_copy_', .)"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>