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

Defining XSD (XML Schema) type without a namespace but referring to it with namespace

提问人:geckels1 提问时间:10/4/2023 更新时间:10/4/2023 访问量:44

问:

很抱歉,如果这个问题有点奇怪,但我是 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>

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

XSD 命名空间 XML 命名空间

评论

0赞 mamift 10/4/2023
当你说“但是类型未在命名空间 vt 中定义”时,这是你得到的实际错误还是你自己得出的结论?
0赞 jdweng 10/4/2023
有一个没有前缀的默认命名空间xmlns="http://www.w3.org/2001/XMLSchema"
0赞 geckels1 10/18/2023
@mamift这是我自己得出的结论。这个模式工作,我只是不知道怎么做。但答案是目标命名空间和 vt 命名空间是相同的,因此它可以工作。

答:

3赞 Michael Kay 10/4/2023 #1

复杂类型(与架构文档中的所有其他顶级声明一样)位于命名空间中,因为它被声明为架构文档的目标命名空间。全局组件属性中显示的名称始终位于目标命名空间中,但从其他位置引用组件时需要命名空间前缀。OfferByRangeTypehttp://api.spp.org/schema/mui/Virtual/v2name

1赞 FLUXparticle 10/4/2023 #2

架构定义目标命名空间中的所有元素。在 schema 标记中定义。如您所见,它与 vt 命名空间相同。因此,这不仅是正确的。这也是常见的做法。尽管大多数人将目标命名空间称为 tns。

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

xmlns="http://api.spp.org/schema/mui/Virtual/v2"

评论

0赞 geckels1 10/18/2023
我看到目标命名空间和 vt 命名空间被定义为同一个命名空间。现在有意义了。