schemagen.exe生成具有<xs:complexType>的非确定顺序的xsd模式

Dmi*_*try 5 xsd jaxb schemagen jaxb2-maven-plugin

我使用org.codehaus.mojo jaxb2-maven-plugin为我的类生成xsd模式.插件站点 http://mojo.codehaus.org/jaxb2-maven-plugin/faq.html告诉,该插件使用JDK实用程序schemagen.exe进行生成. 问题是生成的xsd中的顺序未确定,并且取决于您运行插件的计算机.

public class One {
    public String field1;
}

public class Two {
    public String field2;
}
Run Code Online (Sandbox Code Playgroud)

并生成方案:

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="two">
    <xs:sequence>
      <xs:element name="field2" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>  

  <xs:complexType name="one">
    <xs:sequence>
      <xs:element name="field1" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
Run Code Online (Sandbox Code Playgroud)

但是,当我的同事经营一代时,他会得到另一个订单:

<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="one">
    <xs:sequence>
      <xs:element name="field1" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>


  <xs:complexType name="two">
    <xs:sequence>
      <xs:element name="field2" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType> 

</xs:schema>
Run Code Online (Sandbox Code Playgroud)

我们用

  • JDK 1.6.0_26
  • jaxb2-maven-plugin 1.3
  • jaxb-impl版本2.1.12(由插件使用)

有没有办法控制这个订单?

Mos*_*roy 0

我遇到了同样的问题,最终在生成的 XSD 上应用了 XSLT 转换,对内容进行排序,使用以下 XSL 代码:

<?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:saxon="http://saxon.sf.net/">

<!-- Indent the result (this is not strictly necessary, and forces to use Saxon) -->
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" saxon:indent-spaces="4"/>
<xsl:template match="xs:schema">
    <!-- Copy the schema node with its attributes, but without its children -->
    <xsl:copy>
        <xsl:copy-of select="@*"/>

        <!-- Copy the namespace nodes (sorted) -->
        <xsl:for-each select="./xs:import">
            <xsl:sort select="@namespace"/>
            <xsl:apply-templates select="."/>
        </xsl:for-each>

        <!-- Copy the element nodes (sorted) -->
        <xsl:for-each select="./xs:element">
            <xsl:sort select="@name"/>
            <xsl:apply-templates select="."/>
        </xsl:for-each>

        <!-- Copy the simpleType nodes (sorted) -->
        <xsl:for-each select="./xs:simpleType">
            <xsl:sort select="@name"/>
            <xsl:apply-templates select="."/>
        </xsl:for-each>

        <!-- Copy the complexType nodes (sorted) -->
        <xsl:for-each select="./xs:complexType">
            <xsl:sort select="@name"/>
            <xsl:apply-templates select="."/>
        </xsl:for-each>

        <!-- Copy all the other nodes (if there are) -->
        <xsl:for-each select="./*[not(self::xs:import or self::xs:element or self::xs:simpleType or self::xs:complexType)]">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:copy>   
</xsl:template>

<xsl:template match="xs:import">
    <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="xs:simpleType">
    <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="xs:complexType">
    <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="xs:element">
    <xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

我使用 xml-maven-plugin 进行了 XSLT 转换:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>xml-maven-plugin</artifactId>
    <version>1.0.2</version>
    <executions>
        <execution>
            <goals>
                <goal>transform</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <transformationSets>
            <transformationSet>
                <dir>path/to/xsd</dir>
                <stylesheet>path/to/sortXSD.xsl</stylesheet>
                <outputDir>path/to/xsd</outputDir>
            </transformationSet>
        </transformationSets>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>net.sf.saxon</groupId>
            <artifactId>saxon</artifactId>
            <version>8.7</version>
        </dependency>
    </dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)