Stylesheet magic:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output indent="yes" standalone="yes" omit-xml-declaration="yes" method="xml"/>
<xsl:template match="*">
<xsl:copy>
<xsl:variable name="Values" select="@*[(name(..)='param') and ((name(.)='value'))]"/>
<xsl:variable name="NonValues" select="@*[. != $Values]"/>
<xsl:apply-templates select="$NonValues" mode="NonValues"/>
<xsl:apply-templates select="$Values" mode="Values"/>
<xsl:choose>
<xsl:when test="*">
<xsl:apply-templates select="*"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
<xsl:template match="@*" mode="Values">
<xsl:attribute name="value"><xsl:variable name="n" select="."/><xsl:choose><xsl:when test="../@id=1"><xsl:value-of select="(($n - (-0.3)) div 2.3) * 100"/></xsl:when><xsl:when test="../@id=2"><xsl:value-of select="(($n - (-0.8)) div 3.3) * 100"/></xsl:when><xsl:when test="../@id=3"><xsl:value-of select="(($n - (-0.5)) div 1.5) * 100"/></xsl:when><xsl:when test="../@id=4"><xsl:value-of select="(($n - (0.1)) div 1.1) * 100"/></xsl:when><xsl:otherwise><xsl:value-of select="."/></xsl:otherwise></xsl:choose></xsl:attribute>
</xsl:template>
<xsl:template match="@*" mode="NonValues">
<xsl:copy>
<xsl:value-of select="(.)*2"/>pp
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
If you can transform the original XML with this stylesheet, you will get a new XML with calculated results. It is a bit complex but basically the code is processing all elements and child elements. For each element, it splits the attributes up in values that need to be converted and other values. It copies every element, every child element and every attribute, except the value attributes. The value attributes are processed and given another value. (But you can also just add the original value, if you want to keep it.)