抱歉,如果这个问题有点奇怪,但我是 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 命名空间。谢谢!
复杂类型
OfferByRangeType
- 与模式文档中的所有其他顶级声明一样 - 位于命名空间 http://api.spp.org/schema/mui/Virtual/v2
中,因为它被声明为模式文档的目标命名空间。全局组件的 name
属性中出现的名称始终位于目标命名空间中,但从其他地方引用该组件时需要命名空间前缀。
模式定义了目标命名空间中的所有元素。这是在 schema 标签中定义的。正如您所看到的,它与 vt 命名空间相同。所以这不仅是正确的。这也是常见的做法。尽管大多数人将目标命名空间称为 tns。
如果你想引用自己的元素而不需要前缀(命名空间),你可以将默认命名空间定义为目标命名空间,如下所示:
xmlns="http://api.spp.org/schema/mui/Virtual/v2"