gpt4 book ai didi

XML 架构 : how to reference a type from a no namespace XSD

转载 作者:行者123 更新时间:2023-12-04 16:54:34 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

为了完整性:如果导入的模式有目标命名空间,则需要做两件事:
  • 将导入模式的目标命名空间绑定(bind)到某个前缀,例如 imported
  • 前缀 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>

  • 正如在变色龙设计上发布的链接中提到的,导入模式的替代方法是包含模式。

    然而,即使采用这种设计, type 的值(value)属性仍然需要正确定义,即:
  • 如果没有目标命名空间
  • 或者没有前缀(也没有默认命名空间)
  • 或使用适当的前缀,绑定(bind)到目标命名空间
  • 或者没有前缀,目标命名空间被定义为默认命名空间

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

    关于XML 架构 : how to reference a type from a no namespace XSD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45747199/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com