我的总体目标是在几个小的xsd中分解一个大的xsd,一个特别是我希望在其他xsds中重用的元素和复杂类型。假设类型xsd被称为" types.xsd"而另一个xsds被称为" request.xsd"
话虽如此,我宣布了一个中央ID" evalancheId"作为元素并尝试引用(使用ref)它们。但是,生成的XML带有一个不需要的命名空间前缀" ns:evalancheId"对于引用的元素。
types.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://hansgrohe.com/pi/PA/C4C/Contact/10"
xmlns="http://hansgrohe.com/pi/PA/C4C/Contact/10">
<xsd:element name="evalancheId" type="xsd:int"/>
<xsd:complexType name="contactComplexType">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="1" name="givenName">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:minLength value="1"/>
<xsd:maxLength value="40"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<!-- ... -->
</xsd:sequence>
</xsd:complexType>
request.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://hansgrohe.com/pi/PA/C4C/Contact/10"
xmlns="http://hansgrohe.com/pi/PA/C4C/Contact/10">
<xsd:include schemaLocation="types.xsd"/>
<xsd:element name="updateContactReq" type="contactUpgradeComplexType"/>
<xsd:complexType name="contactUpgradeComplexType">
<xsd:complexContent>
<xsd:extension base="contactComplexType">
<xsd:sequence>
<xsd:element ref="evalancheId" minOccurs="1" maxOccurs="1"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
为result.xml
<ns:updateContactReq xmlns:ns="http://hansgrohe.com/pi/PA/C4C/Contact/10">
<givenName>Jay</givenName>
<ns:evalancheId>0815</ns:evalancheId>
</ns:updateContactReq>
actually_wanted.xml
<ns:updateContactReq xmlns:ns="http://hansgrohe.com/pi/PA/C4C/Contact/10">
<givenName>Jay</givenName>
<evalancheId>0815</evalancheId>
</ns:updateContactReq>
问题
非常感谢和亲切的问候 Tschenser
答案 0 :(得分:1)
我不相信你可以。只有全局元素可供包含/导入XSD重用。但是全局元素始终位于其自己的XSD的目标名称空间中。 您可以将elementFormDefault设置为“不合格”&#39;并将该元素声明为本地(即非全局)元素定义。但这会破坏您将元素包含在单独的XSD中的目标。 我认为最适合您的解决方案是在单独的XSD中定义类型,但在主XSD中本地定义元素声明。这样,元素声明可以是本地的,而复杂类型是在单独的XSD中定义的。