/ / Jak dodać tekst przed wartościami w xml? - xml, xpath, xmlstarlet

Jak dodać tekst przed wartościami w xml? - xml, xpath, xmlstarlet

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 № 1

Zgodnie 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