在XSD中,我可以为直接声明的元素提供类型名称

时间:2014-09-22 13:52:47

标签: xml xsd

在XSD中,有几种直接声明的复杂类型。在将使用此XSD的系统以及生成的XML中,它只是对这些复杂类型进行编号:COMPLEXTYPE1,COMPLEXTYPE2 ...如果我在中间添加一个新的复杂类型""这个其他系统将重新编号类型并导致错误,因为数字"向下移动"。

我试图将一个TYPE名称添加到XSD,但这不起作用,我看到了这个错误: typeType属性不能与complexType

的simpleType一起出现
<xs:element name ="Test" type ="testType"> <!--Doesn't like type in a direct element-->
    <xs:complexType>
        <xs:sequence>
            <xs:element name ="String1" type ="xs:string"/>
            <xs:element name ="String2" type ="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

我对外部声明的初步想法:为什么要打扰那些只使用过一次的声明。我确实为普通事物声明了类型。如果以后我不止一次需要一些东西我会重构。

阅读有关XSD定义(萨拉米香肠切片,俄罗斯嵌套玩偶和百叶帘),看起来我必须在主模式之外声明这些类型,然后将它们拉入。

有没有办法为直接声明的元素添加类型名称?或者我只是需要声明我的所有类型并克服它?

最后一个想法,也许它是消费系统的一个问题,其他系统如何处理未命名的类型?无论如何,我对消费系统没有任何控制权。

3 个答案:

答案 0 :(得分:0)

您要声明一个元素而不是一个类型。如果在元素上指定type属性,则创建指定类型的元素。因此很明显,已经有类型(您指定)的元素不能具有使用&lt; xs:complexType&gt;指定的类型。

如果你想声明类型并扩展它们就这样做(布尔值):

<xs:simpleType name="boolean">
<xs:annotation>
<xs:documentation>A boolean value can have the values [$true, true, $false, false] indicating true or false</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="true"/>
<xs:enumeration value="$true"/>
<xs:enumeration value="false"/>
<xs:enumeration value="$false"/>
<xs:enumeration value="0"/>
<xs:enumeration value="1"/>
</xs:restriction>
</xs:simpleType>

然后你可以像

一样使用它
<xs:element name ="Test" type ="boolean">

答案 1 :(得分:0)

name属性不用于匿名的嵌入式xs:complexType定义。

如果要命名复杂类型,请全局声明:

<xs:complexType name="testType">
    <xs:sequence>
        <xs:element name="String1" type ="xs:string"/>
        <xs:element name="String2" type ="xs:string"/>
    </xs:sequence>
</xs:complexType>

然后您就可以按名称引用该类型:

<xs:element name="Test" type="testType"/>

答案 2 :(得分:0)

您的问题非常混乱,但一般规则是您要么在顶层声明类型(全局)并为它们指定一个名称,元素声明可以在type属性中引用它们,或者你将它们包含在元素声明中并使它们匿名,在这种情况下,类型没有名称,包含元素没有@type属性。