XSD允许一个元素位于两个位置



我正在尝试在xsd:choice之前或之后都允许OUTPUTFORMAT。我曾尝试使用xsd:all而不是xsd:sequence,但当我这样做时,在IMAGE元素上执行maxOccurs="300"时会出现错误。提前感谢您的任何建议。

<xsd:complexType name="IMDType">
<xsd:sequence>
<xsd:element name="VERSION" type="versionType"/>
<xsd:element name="GENERATIONTIME" type="dateTimeType"/>
<xsd:element name="PRODUCTORDERID" type="productOrderIdType" minOccurs="0"/>
<xsd:element name="PRODUCTCATALOGID" type="catIdOrNoneType"/>
<xsd:element name="CHILDCATALOGID" type="catIdOrNoneType" minOccurs="0"/>
<xsd:element name="IMAGEDESCRIPTOR" type="imageDescriptorType"/>
<xsd:element name="PRODUCTSCALE" type="productScaleType" minOccurs="0"/>
<xsd:element name="PRODUCTACCURACY" type="productAccuracyType" minOccurs="0"/>
<xsd:element name="RMSE2D" type="floatType" minOccurs="0"/>
<xsd:element name="BANDID" type="bandIdType"/>
<xsd:element name="PANSHARPENALGORITHM" type="panSharpenAlgorithmType"/>
<xsd:element name="NUMROWS" type="longType"/>
<xsd:element name="NUMCOLUMNS" type="longType"/>
<xsd:element name="PRODUCTLEVEL" type="productLevelType"/>
<xsd:element name="PRODUCTTYPE" type="productTypeType"/>
<xsd:element name="NUMBEROFLOOKS" type="intType"/>
<xsd:element name="RADIOMETRICLEVEL" type="radiometricLevelType" minOccurs="0"/>
<xsd:element name="RADIOMETRICENHANCEMENT" type="radiometricEnhancementType" minOccurs="0"/>
<xsd:element name="BITSPERPIXEL" type="intType" minOccurs="0"/>
<xsd:element name="RESTRICTEDAREAINTERSECT" type="restrictedAreaIntersectType" minOccurs="0"/>
<xsd:element name="COMPRESSIONTYPE" type="compressionType" minOccurs="0"/>
<xsd:element name="JPEGPROFILENAME" type="jpegProfileNameType" minOccurs="0"/>
<xsd:choice maxOccurs="8">
<xsd:element name="BAND_B" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_C" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_G" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_N" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_N2" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_P" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_R" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_RE" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_S1" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_S2" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_S3" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_S4" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_S5" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_S6" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_S7" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_S8" type="imdBandType" minOccurs="0"/>
<xsd:element name="BAND_Y" type="imdBandType" minOccurs="0"/>
<xsd:element name="WV03_SWIR" type="imdBandType" minOccurs="0"/>
</xsd:choice>
<xsd:element name="OUTPUTFORMAT" type="ouputFormatType" minOccurs="0"/>
<xsd:element name="IMAGE" type="imdImageListType" maxOccurs="300"/>
<xsd:element name="MAP_PROJECTED_PRODUCT" type="imdMapProjProdType" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>

如果用模型组G替换选择,则可以将内容模型写成((OUTPUTFORMAT?,G?(|(G,OUTPUTFFORMAT?(

choice
sequence
OUTPUTFORMAT minOccurs=0
G minOccurs=0
sequence
G
OUTPUTFORMAT minOccurs=0

但这样的设备变得越来越复杂,最终,不清楚你在实现什么——关于什么是允许的和什么是不允许的规则变得越来越难以让任何人理解。你真的想做一个决定:要么完全灵活地订购,要么完全严格地订购

顺便说一句,像maxOccurs=300这样的子句可能会导致某些模式处理器的性能非常差。你真的有充分的理由设定这个限制吗?

最新更新