Bonjour

J'ai un fichier xsd qui importe 158 autre xsd.
parmis ces xsd il y a xhtml.xsd qui lui-même importe xml.xsd (xml:lang)

J'utilise XJC 2.2 pour générer les classes java.
mais j'obtient des conflits.

l'attribut lang est définit dans deux fichiers une de mes xsd et l'autre dans xml.xsd
les éléments code et adresse qui sont définis dans une de mes xsd et dans xhtml.xsd.

le compile avec maven
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
<configuration>
    <packageName>fr.fhir</packageName>
    <sources>
      <source>${basedir}/src/main/resources/fhir-codegen-xsd/fhir-all.xsd</source>
    </sources>
    <clearOutputDir>true</clearOutputDir>
    <outputDirectory>${basedir}/src/main/java/</outputDirectory>
    <bindingDirectory>${basedir}/src/main/xjb/</bindingDirectory>
    <bindingFiles>
      <!--<bindingFile>lang.xjb</bindingFile>-->
      <bindingFile>global.xjb</bindingFile>
    </bindingFiles>
</configuration>
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
<jaxb:bindings
	schemaLocation="../resources/fhir-codegen-xsd/fhir-all.xsd"
	xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
	jaxb:version="2.0">
	<jaxb:bindings>
		<jaxb:globalBindings typesafeEnumMaxMembers="2000" />
	</jaxb:bindings>
</jaxb:bindings>

J'ai essayé d'ajouter un fichier xjb pour lang
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
<jaxb:bindings 
	xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
	xmlns:xs="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0">
 
<!-- 	schemaLocation="../resources/fhir-codegen-xsd/fhir-all.xsd" -->
<!-- 	schemaLocation="../resources/fhir-codegen-xsd/fhir-xhtml.xsd" -->
	<jaxb:bindings
		node="//xs:attribute[@ref='xml:lang']">
		<jaxb:property name="xmlLang" />
	</jaxb:bindings>
</jaxb:bindings>

mais quelque soit la valeur de shema location la racine ou xhtml ça ne fonctionne pas.
avec all.xsd il indique que [CODEonline]//xs:attribute[@ref='xml:lang'][/CODEonline] ne matche rien.
avec xhtml.xsd il indique que xhtml.xsd ne fait pas partit de la compilation alors qu'il est importé par all.xsd

J'ai modifié xhtml.xsd pour ajouter
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
		<xs:attribute ref="xml:lang">
			<xs:annotation>
				<xs:appinfo>
					<jaxb:property name="xmlLang" />
				</xs:appinfo>
			</xs:annotation>
		</xs:attribute>

pour les éléments Code et Adress j'ai le même conflit que pour l'attribut
Mais là rien à faire impossible de trouver une solution
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
	<xs:element name="code">
		<xs:annotation>
			<xs:appinfo>
					<jaxb:property name="htmlCode" />
				</xs:appinfo>
		</xs:annotation>
		<xs:complexType mixed="true">
la compilation indique que ce mapping ne peut être appliqué.

Mais je pense que ce n'est pas la bonne approche.
ce que je voudrais, et je pense que ça résoudrait tout c'est que all.xsd targetNamespace="http://hl7.org/fhir" produise des classes dans org.hl7.fhir
et que xhtml.xsd targetNamespace="http://www.w3.org/1999/xhtml" produise dans org.w3c.xhtml

j'ai pensé ajouter
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
	<xs:annotation>
		<xs:appinfo>
			<jaxb:globalBindings>
				<xjc:simple />
			</jaxb:globalBindings>
			<jaxb:schemaBindings>
				<jaxb:package name="com.custom.package" />
			</jaxb:schemaBindings>
		</xs:appinfo>
	</xs:annotation>
dans le fichier xhtml.xsd ou mettre ce genre de chose dans un fichier xjb
mais ça entre en conflit avec globalBindings typesafeEnumMaxMembers

Comment faire pour que les classes soit générées dans un package différent en fonction du namespace ?

A+JYT