如何在xml中的值之前添加文本?

时间:2014-06-20 19:48:22

标签: xml xpath xmlstarlet

这是我的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"/>
…

2 个答案:

答案 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>