XSD期望错误的namepsace的正确元素

时间:2014-10-17 13:24:23

标签: xml xsd

我想在命名空间“foo”中定义一个模式,该模式在名称空间“bar”中导入一个模式,并定义了复杂类型,并在“bar”中引用类型。我错过了什么来进行验证? MWE如下。

根架构:

<?xml version="1.0" encoding="ISO-8859-1"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    xmlns:f="foo" xmlns:b="bar" targetNamespace="foo">

<import schemaLocation="Import.xsd" namespace="bar"/>

<element name="root" type="f:Root"/>

<complexType name="Root">
    <sequence>
        <!--<element ref="b:imported"/>-->
        <element name="imported" type="b:ImportedType"/>
    </sequence>
</complexType>
</schema>

导入的架构:

<?xml version="1.0" encoding="ISO-8859-1"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="bar"
    elementFormDefault="qualified">
<complexType name="ImportedType"/>
<!--
<element name="imported">
    <complexType/>
</element>
-->
</schema>

XML实例:

<?xml version="1.0" encoding="UTF-8"?>
<f:root xmlns:f="foo" xmlns:b="bar">
    <b:imported/>
</f:root>

结果: 元素'{bar}已导入':此元素不是预期的。预期是({foo}导入)。

如果我将设计模式从Venetian Blind改为Salami Slice(在模式中切换评论)一切正常。但是我们所有的其他模式都在VB中,所以我宁愿不改变这种情况。

尝试使用xmllint和notepad ++进行验证

1 个答案:

答案 0 :(得分:1)

您希望b:imported代替f:imported

问题是,您已导入并使用类型。您的类型ImportedType仍在b

然而,您的元素imported(尽管名称所示)未从b导入,但在f中声明。

因此f:imported是正确的和预期的。

如果要使用元素“转义”命名空间,请在imported中声明f并改为使用元素引用:

<xs:element ref="b:imported"/>