XML Schema:导入共享元素时的命名空间问题

时间:2010-04-14 12:01:33

标签: xml xsd xml-namespaces xml-validation xml-import

尝试从XML Schema导入共享定义时,我可以正确引用共享类型,但引用共享元素会导致验证错误。

这是导入共享定义的模式(example.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
  elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:shared="http://shared.com">

    <xs:import namespace="http://shared.com" schemaLocation="shared.xsd"/>

    <xs:element name="example">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="importedElement"/>
                <xs:element ref="importedType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="importedElement">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="shared:fooElement"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="importedType">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="bar" type="shared:barType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

这些是共享定义(shared.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://shared.com"
    targetNamespace="http://shared.com">

    <xs:element name="fooElement">
        <xs:simpleType>
            <xs:restriction base="xs:integer"/>
        </xs:simpleType>
    </xs:element>

    <xs:simpleType name="barType">
        <xs:restriction base="xs:integer"/>
    </xs:simpleType>

</xs:schema>

现在考虑这个XML实例:

<?xml version="1.0"?>
<example
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                     
  xsi:noNamespaceSchemaLocation="example.xsd">
    <importedElement>
        <fooElement>42</fooElement>
    </importedElement>
    <importedType>
        <bar>42</bar>
    </importedType>
</example>

验证后,“importedType”工作正常,但“importedElement”会出现以下错误:

  

从元素'fooElement'开始发现无效内容。其中一个'{“http://shared.com”:fooElement}'是预期的

我猜我的麻烦与名称空间问题有关(因此在某种程度上误导“得到fooElement但是期待fooElement”) - 这里有什么错误提示吗?

1 个答案:

答案 0 :(得分:0)

您正在引用fooElement,就好像它没有命名空间一样,您需要在实例文档中使用正确的命名空间:

<?xml version="1.0"?>
<example
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                     
  xsi:noNamespaceSchemaLocation="example.xsd" xmlns:shared="http://shared.com">
    <importedElement>
        <shared:fooElement>42</shared:fooElement>
    </importedElement>
    <importedType>
        <bar>42</bar>
    </importedType>
</example>

编辑:我应该指出: types 元素之间存在差异;只有后者出现在文档中(有一些例外),这就是为什么导入的类型可以按你的需要工作,而你的元素却没有。