I have an XML file which contents a commented section. My requirement is to uncomment it using a shell script. Any help would be highly appreciated.
<!--<transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender">
<parameter name="mail.smtp.from">xx</parameter>
<parameter name="mail.smtp.user">xx</parameter>
<parameter name="mail.smtp.password">xx</parameter>
<parameter name="mail.smtp.host">smtp.gmail.com</parameter>
<parameter name="mail.smtp.port">587</parameter>
<parameter name="mail.smtp.starttls.enable">true</parameter>
<parameter name="mail.smtp.auth">true</parameter>
</transportSender>-->
Using xsltproc, you will need this file my.xsl to process your xml input:
<?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" indent="yes" encoding="utf-8"/>
<xsl:template match="@*|node()"><!-- identity transformation -->
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="comment()"><!-- comments transformation -->
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
Assuming your input file my.xml looks like this:
<?xml version="1.0" ?>
<my-tag>
<!--<transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender">
<parameter name="mail.smtp.from">xx/parameter>
<parameter name="mail.smtp.user">xx</parameter>
<parameter name="mail.smtp.password">xx</parameter>
<parameter name="mail.smtp.host">smtp.gmail.com</parameter>
<parameter name="mail.smtp.port">587</parameter>
<parameter name="mail.smtp.starttls.enable">true</parameter>
<parameter name="mail.smtp.auth">true</parameter>
</transportSender>-->
</my-tag>
Now, you can run next command:
xsltproc my.xsl my.xml | sed -e 's/</</g' -e 's/>/>/g'
The sed transformation was necessary to restore the '<' and '>' chars in the output.
This gives you following output:
<?xml version="1.0" encoding="utf-8"?>
<my-tag>
<transportSender name="mailto" class="org.apache.axis2.transport.mail.MailTransportSender">test
<parameter name="mail.smtp.from">xx/parameter>
<parameter name="mail.smtp.user">xx</parameter>
<parameter name="mail.smtp.password">xx</parameter>
<parameter name="mail.smtp.host">smtp.gmail.com</parameter>
<parameter name="mail.smtp.port">587</parameter>
<parameter name="mail.smtp.starttls.enable">true</parameter>
<parameter name="mail.smtp.auth">true</parameter>
</transportSender>
</my-tag>
If you don't want to uncomment all the comments, you can write a more specific rule to select only the comment nodes you want to uncomment. If you don't know how, just ask for it.