【问题标题】:XML Schema: how to reference a type from a no namespace XSDXML Schema:如何从无命名空间 XSD 中引用类型
【发布时间】:2017-08-18 01:34:38
【问题描述】:

所以我有一个没有指定命名空间的 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 引用这种类型??

【问题讨论】:

    标签: xml import xsd namespaces wsdl


    【解决方案1】:

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

    如果导入的模式没有命名空间,这似乎是这里的情况,那么type 属性的值应该是无前缀的。但是,由于在模式 sn-p 中似乎定义了默认命名空间并且与 XML 模式命名空间 (http://www.w3.org/2001/XMLSchema) 相同,因此引擎尝试在 XML 模式命名空间中查找名为 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>
      

    正如 chameleon design 上发布的链接所述,导入架构的替代方法是包括架构。​​

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

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

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

    【讨论】:

    • 感谢您的详细解释。当有很多命名空间和绑定正在进行时,我经常对命名空间感到困惑。尤其是当一个 WSDL 有很多 XSD 导入并且它们不在同一个命名空间中时。
    【解决方案2】:

    我是在花时间上网阅读后才知道的。 我阅读了“变色龙”设计,它帮助我更多地了解命名空间。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-16
      • 2016-04-23
      • 2021-05-04
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2016-06-08
      相关资源
      最近更新 更多