所以我有一个没有指定命名空间的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引用此类型?
答案 0 :(得分:1)
这个想法是type
属性是一个QName,这意味着它对前缀绑定很敏感。
如果导入的模式没有命名空间(这里似乎是这种情况),那么type
属性的值应该没有前缀。但是,由于在模式片段中,似乎默认命名空间已定义且与XML Schema命名空间(http://www.w3.org/2001/XMLSchema
)相同,因此引擎会尝试在XML Schema命名空间中查找名为AuthenticationRequest
的类型。这可以通过将XML Schema名称空间绑定到前缀(通常是xs
或xsd
)来解决,而不是将其设置为默认值。
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
...
>
<xs:import schemalocation="A.xsd"/>
<xs:element name="AuthenticationRequest" type="AuthenticationRequest"/>
</xs:schema>
为了完整性:如果导入的模式具有目标名称空间,则需要做两件事:
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
属性的值,即:
非常重要的是,即使只有一个模式,也没有导入或包含其他模式,上述内容也适用。如果模式没有名称空间,它可以开箱即用,但如果有目标名称空间,则需要考虑它。
答案 1 :(得分:0)
我花时间在网上阅读后想通了。 我读到了变色龙&#34;变色龙&#34;设计,它可以帮助我更多地了解命名空间。