2014-06-20 66 views
3

這裏是我的test.xml文件:如何在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"/> 
… 

回答

4

按照期望的結果命令行幫助,使用xmlstarlet ed,可以使用更新-u選項,幷包括一個置換的XPath表達式-x

xmlstarlet ed -u<xpath>-x<xpath>

在替換表達式可以使用XPath concat()函數以生成所述串將取代的屬性。表達式concat('_copy_',.)將在之前連接字符串'_copy_'當前節點,這是您選擇的屬性。你的表情應該是:

xmlstarlet ed -u "//file[@name]/@name" -x "concat('_copy_',.)" test.xml 
+0

這很有趣。我在安裝該工具後嘗試了這個,但'-x'選項似乎不起作用。我發現它的一個版本說明它尚未實現。 –

+0

'-x'(或'--expr')在1.2.0中實現 – npostavs

+0

太棒了!它工作正常。謝謝! – kodopik

2

如果你願意使用的xmlstarlettr命令你可以得到具有以下幫手XSLT 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> 

和呼叫

xmlstarlet tr convert.xslt test.xml 
相關問題