定义不带命名空间的 XSD(XML 架构)类型,但使用命名空间引用它

问题描述 投票:0回答:2

抱歉,如果这个问题有点奇怪,但我是 XSD 新手,并且有一段我无法理解的 XSD 代码。代码如下,因为如果没有代码,问题会很混乱。

XSD 代码定义了一个没有命名空间(即默认命名空间)的新复杂类型,但元素定义使用带有命名空间的新类型。这是允许的还是我目前对命名空间的理解告诉我这是不允许的。我认为要在命名空间中使用类型,它必须在同一命名空间中定义。但如果它是在默认命名空间中定义的,也许就可以了?

<schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://api.spp.org/schema/mui/Virtual/v2" xmlns:cmn="http://api.spp.org/schema/mui/Common/v4"
xmlns:vt="http://api.spp.org/schema/mui/Virtual/v2">

...

<element name="OfferByRange" type="vt:OfferByRangeType" />

<complexType name="OfferByRangeType">
    <sequence>
        <element name="UseSlope" type="boolean" maxOccurs="1" minOccurs="1" />
        <element maxOccurs="10" minOccurs="1" name="Point" type="cmn:MWPricePointType">
        </element>
    </sequence>
    <attributeGroup ref="vt:OfferByRangeIdGroup" />
</complexType>

<attributeGroup name="OfferByRangeIdGroup">
    <attribute name="locationName" type="cmn:LocationNameType" use="required" />
    <attribute name="startHour" type="cmn:DatetimeHourType" use="required" />
    <attribute name="stopHour" type="cmn:DatetimeHourType" use="required" />
</attributeGroup>

<element name="OfferByRange" type="vt:OfferByRangeType" />
指的是命名空间
OfferByRangeType
中的类型
vt
。但是类型没有在命名空间中定义
vt
让我觉得这是不允许的?我只是想更好地理解 XML 命名空间。谢谢!

xml xsd namespaces xml-namespaces
2个回答
0
投票

复杂类型

OfferByRangeType
- 与模式文档中的所有其他顶级声明一样 - 位于命名空间
http://api.spp.org/schema/mui/Virtual/v2
中,因为它被声明为模式文档的目标命名空间。全局组件的
name
属性中出现的名称始终位于目标命名空间中,但从其他地方引用该组件时需要命名空间前缀。


0
投票

模式定义了目标命名空间中的所有元素。这是在 schema 标签中定义的。正如您所看到的,它与 vt 命名空间相同。所以这不仅是正确的。这也是常见的做法。尽管大多数人将目标命名空间称为 tns。

如果你想引用自己的元素而不需要前缀(命名空间),你可以将默认命名空间定义为目标命名空间,如下所示:

xmlns="http://api.spp.org/schema/mui/Virtual/v2"
© www.soinside.com 2019 - 2024. All rights reserved.