Exchange capitalization Given two strings of letters, transfer the capitalization pattern of each string onto the other one. Fewest bytes wins.

Input:   CodeGolf xxPPCGxx  
Output:  coDEGOlf XxppCgxx



Both strings will be equal-length and nonempty, with only letters a..z and A..Z. 
You may output the two resulting strings in either order relative to the inputs.
You may represent a pair of strings as one string with a non-letter single-character separator for input and/or output.
You may represent a string as a list of characters or one-character strings, but not as a sequence of code point values unless these are simply strings in your language.
Your input and output may represent strings differently.


Test cases:

CodeGolf xxPPCGxx -&gt; coDEGOlf XxppCgxx
lower UPPER -&gt; LOWER upper
MiXeD lower -&gt; mixed LoWeR
A A -&gt; A A
ABcd EfGh -&gt; AbCd EFgh
Java (JDK 10), 66 bytes



a-&gt;b-&gt;{for(int i=a.length,t;i--&gt;0;b[i]^=t)a[i]^=t=(a[i]^b[i])&amp;32;}


Try it online!

Explanations

a-&gt;b-&gt;{                           // Curried lambda
 for(int i=a.length,t;i--&gt;0;      //  Descending loop on i,
                                  //  Declare t
     b[i]^=t                      //   Apply the case difference to b[i]
   )
  a[i]^=t=(a[i]^b[i])&amp;32;         //   Assign the case difference of the two letters to t, and apply it to a[i].
}