对元素的引用将(不需要的)命名空间添加到目标xml

时间:2017-11-17 18:12:57

标签: xml xsd schema element ref

我的总体目标是在几个小的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>

问题

  1. 如何摆脱&#34; ns中的命名空间:evalancheId&#34;然后重用evalancheId元素
  2. 非常感谢和亲切的问候 Tschenser

1 个答案:

答案 0 :(得分:1)

我不相信你可以。只有全局元素可供包含/导入XSD重用。但是全局元素始终位于其自己的XSD的目标名称空间中。 您可以将elementFormDefault设置为“不合格”&#39;并将该元素声明为本地(即非全局)元素定义。但这会破坏您将元素包含在单独的XSD中的目标。 我认为最适合您的解决方案是在单独的XSD中定义类型,但在主XSD中本地定义元素声明。这样,元素声明可以是本地的,而复杂类型是在单独的XSD中定义的。