XML Schema:如何从无命名空间XSD引用类型

时间:2017-08-18 01:34:38

标签: xml import xsd namespaces wsdl

所以我有一个没有指定命名空间的XSD。

然后我将它导入另一个模式(B.xsd),该模式的命名空间用“targetnamespace ='my-name-space'”指定

<import schemalocation="A.xsd"/>

之后我想在B.xsd

中创建一个元素
<element name="AuthenticationRequest" type="AuthenticationRequest"/>

验证失败,说明找不到类型AuthenticationRequest。 这种类型实际上是在A.xsd中定义的。

如何从B.xsd中的A.xsd引用此类型?

2 个答案:

答案 0 :(得分:1)

这个想法是type属性是一个QName,这意味着它对前缀绑定很敏感。

如果导入的模式没有命名空间(这里似乎是这种情况),那么type属性的值应该没有前缀。但是,由于在模式片段中,似乎默认命名空间已定义且与XML Schema命名空间(http://www.w3.org/2001/XMLSchema)相同,因此引擎会尝试在XML Schema命名空间中查找名为AuthenticationRequest的类型。这可以通过将XML Schema名称空间绑定到前缀(通常是xsxsd)来解决,而不是将其设置为默认值。

<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  ...
>
    <xs:import schemalocation="A.xsd"/>
    <xs:element name="AuthenticationRequest" type="AuthenticationRequest"/>
</xs:schema>

为了完整性:如果导入的模式具有目标名称空间,则需要做两件事:

  1. 将导入架构的目标命名空间绑定到某个前缀,例如imported
  2. 使用此前缀前缀type属性的值,如下所示:

    <xs:schema
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:imported="http://www.example.com/imported"
      ...
    >
      <xs:import schemalocation="A.xsd" namespace="http://www.example.com/imported"/>
      <xs:element name="AuthenticationRequest" type="imported:AuthenticationRequest"/>
    </xs:schema>
    
  3. 正如变色龙设计中发布的链接所述,导入架构的替代方案是包括架构。​​

    但是,即使使用此设计,仍需要正确定义type属性的值,即:

    • 如果没有目标名称空间
    • ,则没有前缀(并且没有默认名称空间)
    • 或使用适当的前缀绑定到目标名称空间
    • 或没有前缀,目标名称空间被定义为默认名称空间

    非常重要的是,即使只有一个模式,也没有导入或包含其他模式,上述内容也适用。如果模式没有名称空间,它可以开箱即用,但如果有目标名称空间,则需要考虑它。

答案 1 :(得分:0)

我花时间在网上阅读后想通了。 我读到了变色龙&#34;变色龙&#34;设计,它可以帮助我更多地了解命名空间。

http://www.xfront.com/ZeroOneOrManyNamespaces.html

相关问题