Bon, ce soir, je comprenais pas pourquoi j'avais des éléments non qualifiés dans mes messages SOAP :

<?xml version="1.0"  standalone="no"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:sayHello xmlns:ns2="http://hello/">
<arg0>Juju</arg0>
</ns2:sayHello>
</S:Body>
</S:Envelope>

Alors que dans mon WSDL, j'avais un truc comme ça :

<xs:schema targetNamespace='http://hello/' version='1.0' xmlns:tns='http://hello/' xmlns:xs='http://www.w3.org/2001/XMLSchema'>
 <xs:element name='sayHello' type='tns:sayHello'/>

 <xs:complexType name='sayHello'>
  <xs:sequence>
   <xs:element minOccurs='0' name='arg0' type='xs:string'/>
  </xs:sequence>
 </xs:complexType>
</xs:schema>

Mon arg0 aurait du être dans mon tarnetNamespace !

Alors, j'ai été lire la spécification XML Schema. Je dois dire que c'est un peu douloureux, mais j'ai tout de même trouvé la réponse !

Elle est très bien expliquée sur ce billet de blog, mais, rapidement, la raison vient de l'attribut optionnel elementFormDefault. En effet, cet attribut de schema vaut, par défaut, unqualified. Cela signifie que les éléments définis de manière imbriquée sont définis dans le namespace par défaut !

Alternativement, si l'attribut elementFormDefault avait été spécifié avec une valeur de qualified, alors arg0 aurait bien été dans le namespace http://hello/ !

Parfois, le XML, ça me fatigue....