Some comparisons and a short history of JAX-RPC/JAX-WS. I think the article muddled the data binding differences a little. JAX-WS currently uses JAX-B 2.x. JAX-B 2.x is vastly different from JAX-B 1.x and other implementation bound binding tools like Castor. This article covers the differences between JAX-B 1.x and JAX-B 2.x in more detail. If you really want to appreciate the differences, you need to look at the generated code and appreciate the portability of JAX-B 2.x annotated POJOs.
Any discussion of Java and XML would be incomplete without mentioning JAX-P. Here is a presentation from Java One on the history of JAX-P.
Also of importance is the evolution of SAAJ. The biggest evolutionary step I can remember for SAAJ is when it moved to extend DOM such that your handlers could easily interact directly with the RAW SOAP message XML.
There is also the history of bundled JAX-P, JAX-WS, and JAX-B implementations in the Sun JVM. This FAQ goes over some details of the bundled implementations of JAX-P and how to override them. If memory serves me correctly things started out with Crimson and Saxon being bundled (or at least being the reference implementations) and now Xerces and Xalan are bundled in the Sun distributions. The JAX-WS and JAX-B RIs from Metro are also bundled these days. The version of each bundled API and implementation depends on the major (and occasionally minor) version of the JVM you are using. Your app server will also likely throw its own implementation into the mix just to ruin your day. The endorsed standards override mechanism will be your friend in many of these cases. The config files and/or system properties for defining your SAAJ and JAX-P factory implementations will also be useful.