Oto mój plik test.xml:
<?xml version="1.0"?>
<path>
<dir name="directory">
<file name="file1"/>
<file name="file2"/>
</dir>
</path>
Teraz mogę dodać tekst po moich wartościach:
xmlstarlet ed -s "//file[@name]/@name" -t text -n "@name" -v "_copy_" test.xml
Wynik:
…
<file name="file1_copy_"/>
<file name="file2_copy_"/>
…
Jak mogę dodać tekst? przed wartości?
…
<file name="_copy_file1"/>
<file name="_copy_file2"/>
…
Odpowiedzi:
4 dla odpowiedzi № 1Zgodnie z pomocą linii poleceń, z xmlstarlet ed
, możesz użyć aktualizacja -u
i włącz zastępczą XPath wyrażenie -x
:
xmlstarlet ed -u <xpath> -x <xpath>
W wyrażeniu zastępującym możesz użyć XPath concat()
funkcja generująca ciąg, który zastąpi atrybut. Ekspresja concat("_copy_",.)
złączy ciąg "_copy_"
przed temu bieżącego węzła, który jest atrybut zaznaczania. Wyrażenie powinno być:
xmlstarlet ed -u "//file[@name]/@name" -x "concat("_copy_",.)" test.xml
2 dla odpowiedzi nr 2
Jeśli chcesz użyć tr
polecenia z xmlstarlet
pożądany rezultat można uzyskać z następujących pomocnika 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>
i wywołanie
xmlstarlet tr convert.xslt test.xml