First, you need to quote the dollar signs that are supposed to be interpreted by the shell. As it is, $x and $(dirname $x) and $(basename $x) are parsed by make. You're also missing a semicolon at the end of the body of the while loop. Check the output from running make, you should see the shell complaining about that.
find $(W)/$(OVE) -name "*.xml" -print | \
while read x ; do \
cat $$x | /opt/exp/bin/python2.7 process_results.py > $(W)/$(OVE)/$$(dirname $$x)_$$(basename $$x).xml; \
done
Another likely problem is that $(dirname $x) already contains the $(W)/$(OVE) part. For example, if $(W) is foo and $(OVE) is bar and $x is subdir/subsubdir/wibble.xml, you'll end up trying to write files like foo/bar/foo/bar/subdir/subsubdir_wibble.xml.xml, whereas you probably mean to write foo/bar/foo/bar/subdir/subsubdir_wibble.xml.xml. It's also weird that you're transforming a .xml file into a .xml.xml file. If you meant to strip the original .xml extension, you need to write basename $$x .xml, but it's pointless to remove the extension only to add it again. So you probably meant to write:
find $(W)/$(OVE) -name "*.xml" -print | \
while read x ; do \
/opt/exp/bin/python2.7 process_results.py <$$x >$$(dirname $$x)_$$(basename $$x); \
done
A further problem is that if any of the runs of process_results.py fails, make will continue running and still report a successful build. Tell the shell to stop if an error occurs:
set -e; \
find $(W)/$(OVE) -name "*.xml" -print | \
while read x ; do \
/opt/exp/bin/python2.7 process_results.py <$$x >$$(dirname $$x)_$$(basename $$x); \
done
makeinvocation? (You may want to do this in a directory with only one or a few files, to minimize clutter.)