我有一个带xs:any的XSD 这允许我插入我选择的任何标签/元素。 但是,我想扩展这个XSD,以便我可以指定自己的特定元素,而不是使用xs:any。
我不想编辑相同的XSD,但创建了一个扩展XSD,它添加了我想要使用的特定元素,而不是使用xs:any
这是我的XSD的一部分。
...
...
...
<xs:element name="MRegReq" type="mss:MRegReqType" />
<xs:complexType name="MRegReqType">
<xs:complexContent>
<xs:extension base="mss:MessageAbstractType">
<xs:sequence>
<xs:element name="User" type="mss:UserType" />
<xs:element name="EData" type="xenc:EDataType"
minOccurs="0" />
<xs:any namespace="##other" processContents="lax" minOccurs="0"
maxOccurs="unbounded" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
在上面,
是我想用扩展替换的,所以当我使用JAX-WS重新生成存根等时,我可以访问XSD扩展中指定的各个元素(而不是必须获取request.getAny ()并遍历节点以获取每个元素)。
任何指针/帮助都会非常感激
答案 0 :(得分:0)
您无法替换扩展程序中的元素:
Schema Component Constraint: Derivation Valid (Extension)
如果{derivation method}是扩展名,则以下内容中的适当大小写必须为真:
...
1.2其{attribute uses}必须是复杂类型定义本身的{attribute uses}的子集,也就是说,对于{base type definition}的{attribute uses}中使用的每个属性,必须有属性使用复杂类型定义本身的{attribute uses},其{attribute declaration}具有相同的{name},{target namespace}和{type definition}作为其属性声明。
用简单语言:扩展名必须包含所有元素作为具有相同名称,名称空间和类型的基本类型。
但创建另一个扩展名不应该是一个问题:
<xs:choice>
<xs:element name="MRegReqA" type="mss:MRegReqTypeA" />
<xs:element name="MRegReqB" type="mss:MRegReqTypeB" />
</xs:choice>
<xs:complexType name="MRegReqType">
<xs:complexContent>
<xs:extension base="mss:MessageAbstractType">
<xs:sequence>
<xs:element name="User" type="mss:UserType" />
<xs:element name="EData" type="xenc:EDataType" minOccurs="0" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="MRegReqTypeA">
<xs:complexContent>
<xs:extension base="mss:MRegReqType">
<xs:sequence>
<xs:element name="Product" type="mss:ProductType" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="MRegReqTypeB">
...