2014-09-04 1 views
0

J'essaie de trouver un moyen d'utiliser le même fichier de liaison .xjb pour plusieurs fichiers xsd.Comment réutiliser les liaisons jaxb pour plusieurs xsds?

J'ai trouvé une solution ici pour « flottant raccourcis globaux »: https://www.java.net/node/674443

Cependant, les choses que je suis en train de faire ne semble pas être autorisé par la balise globalBindings.

est ici le code de liaison que j'ai pour un .xsd spécifique:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
     xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" 
     jaxb:version="2.1" 
     jaxb:extensionBindingPrefixes="xjc inheritance"> 
    <jaxb:bindings schemaLocation="../Specific.xsd" node="/xs:schema"> 
     <jaxb:bindings node="//xs:complexType[@name='entity']"> 
      <inheritance:implements>test.IEntity</inheritance:implements> 
     </jaxb:bindings> 
     <jaxb:bindings node="//xs:element[@name='entityContainer']"> 
      <jaxb:class/> 
      <inheritance:implements>test.IEntityContainer</inheritance:implements> 
     </jaxb:bindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

Comment puis-je demander maintenant à tout .xsd dans le répertoire xsd?

J'ai du mal à croire que la seule solution à cela serait de générer réellement les fichiers de liaison unique par fichier xsd (comme indiqué dans l'entrée de forum référencée ci-dessus), ou est-ce vraiment? Notez également que le noeud xpath serait en fait un peu plus compliqué car il y a différents (types de) conteneurs, je l'ai simplement simplifié ici pour ne pas trop compliquer l'exemple.

+0

Vous pouvez utiliser un fichier XML bindings générique et une transformation XSLT pour remplir les parties variables: nom du fichier XSD, nom du type, nom de l'élément , etc. Si cela semble valoir la peine d'avoir des fichiers individuels, je peux fournir une solution de base. – laune

+0

Si vous pouviez donner un exemple, ce serait génial. Notez également s'il vous plaît que je suis en train d'exécuter cela dans maven, donc j'ai besoin d'un moyen d'exécuter la transformation dans le cycle de construction maven. – mac

Répondre

0

Ceci est une binding.xsl de transformation XSLT pour créer ces fichiers à partir d'un modèle de liaison:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:mark="/m/a/r/k" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" > 

    <xsl:param name = "schema" as = "xs:string" /> 
    <xsl:param name = "type" as = "xs:string" /> 
    <xsl:param name = "element" as = "xs:string" /> 

    <xsl:output indent="yes"/> 

    <xsl:variable name = "apo" select = "''''" /> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="*"/> 
    </xsl:template> 

    <xsl:template match="jaxb:bindings"> 
    <xsl:copy> 
     <xsl:apply-templates select="*|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="jaxb:bindings[@mark:mark = 'schema']"> 
    <xsl:copy> 
     <xsl:attribute name="schemaLocation" select='concat("../", $schema, ".xsd")'/> 
     <xsl:apply-templates select="*|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="jaxb:bindings[@mark:mark = 'type']"> 
    <xsl:copy> 
     <xsl:attribute name="node" 
     select='concat("//xs:complexType[@name=", $apo, $type, $apo, "]")'/> 
     <xsl:apply-templates select="*|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="jaxb:bindings[@mark:mark = 'element']"> 
    <xsl:copy> 
     <xsl:attribute name="node" 
     select='concat("//xs:element[@name=", $apo, $element, $apo, "]")'/> 
     <xsl:apply-templates select="*|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="@*"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 

Ceci est le modèle binding.xml:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance" 
    xmlns:mark="/m/a/r/k" 
    jaxb:version="2.1" 
    jaxb:extensionBindingPrefixes="xjc inheritance"> 
    <!-- schemaLocation="../Specific.xsd" --> 
    <jaxb:bindings mark:mark="schema" node="/xs:schema"> 
    <!-- node="//xs:complexType[@name='entity'] --> 
    <jaxb:bindings mark:mark="type" > 
     <inheritance:implements>test.IEntity</inheritance:implements> 
    </jaxb:bindings> 
    <!-- node="//xs:element[@name='entityContainer']" --> 
    <jaxb:bindings mark:mark="element"> 
     <jaxb:class/> 
     <inheritance:implements>test.IEntityContainer</inheritance:implements> 
    </jaxb:bindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

Vous pouvez exécuter cette utilisant saxonne HE , à appeler comme ceci (commande shell unique), avec les trois derniers arguments à modifier en fonction de vos nombreux fichiers XML Schema.

java -cp /extra/saxon/saxon9he.jar net.sf.saxon.Transform \ 
    -s:binding.xml -xsl:binding.xsl \ 
    schema=Specific type=entity element=entityContainer 

Il ne devrait pas être un problème d'appeler cela de maven

Questions connexes