在 XML 模式中导入命名空间
Import namespaces in XML schema
我有两个不同的 .xsd("item" 和 "user"),我想将它们合并为一个 .xsd 使用导入:这个新模式( items.xsd) 将有一个项目序列和一个用户。
问题是我在调用我之前在命名空间中定义的类型的行中遇到此错误:
src-resolve: Cannot resolve the name 'i:item' to a(n) 'type
definition' component.
此外,在 xml 中,我在根元素上收到此错误:
cvc-elt.1.a: Cannot find the declaration of element 'items'.
item.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="item"
xmlns="item" elementFormDefault="qualified">
<xsd:simpleType name="itemID">
<xsd:restriction base="xsd:ID">
<xsd:pattern value="AR[0-9][0-9][0-9][0-9]"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="item" xmlns:i="item">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="description">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="40"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="comments">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="comment" minOccurs="0" maxOccurs="100">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="comment_text">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="75"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="id_user" type="xsd:IDREF" use="required"/>
<xsd:attribute name="id_item" type="xsd:IDREF" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
user.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="user" elementFormDefault="qualified" xmlns="user">
<xsd:simpleType name="usrID">
<xsd:restriction base="xsd:ID">
<xsd:pattern value="[A-Z][0-9][0-9][0-9][0-9][0-9]"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="user" xmlns:u="user">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="alias" type="xsd:string"/>
<xsd:element name="email" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id_user" type="userID" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
items.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:i="item"
xmlns:u="user" targetNamespace="items" elementFormDefault="qualified">
<xsd:import namespace="item" schemaLocation="item.xsd" />
<xsd:import namespace="user" schemaLocation="user.xsd" />
<xsd:element name="items">
<xsd:complexType>
<xsd:sequence>
<!-- ERROR HERE --> <xsd:element name="item" type="i:item" minOccurs="1" maxOccurs="unbounded"/>
<xsd:element name="users">
<xsd:complexType>
<xsd:sequence>
<!-- ERROR HERE --> <xsd:element name="user" type="u:user" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="url" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
items.xml
<!-- ERROR HERE --><items url="http://example.com/items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="items.xsd">
<item id_item="AR0000">
<title>
Item title
</title>
<description>
Item description
</description>
<comments>
<comment id_user="A00000" id_item="AR0000">
<comment_text>
Text
</comment_text>
</comment>
</comments>
</item>
<users>
<user id_user="A00000">
<alias>
User1 alias
</alias>
<email>
user1@gmail.com
</email>
</user>
<user id_user="A00001">
<alias>
User2 alias
</alias>
<email>
user2@hotmail.com
</email>
</user>
</users>
</items>
第一次修复
src-resolve: Cannot resolve the name 'i:item' to a(n) 'type definition'
component.
您只想使用已在其他架构中定义的元素。因此你应该使用 <xsd:element ref="...">
.
您可以像这样更改 <!-- ERROR HERE -->
附近的声明(在 items.xsd 架构中):
<xsd:element ref="i:item" minOccurs="1" maxOccurs="unbounded"/>
和
<xsd:element ref="u:user" minOccurs="1" maxOccurs="unbounded"/>
因为在 <xsd:element>
上使用类型会假定您在其他地方定义了 xsd:simpleType
或 xsd:complexType
。
请注意 user.xsd 中有一个拼写错误:您指的是一个名为 userID
的类型,但我认为正确的拼写是 usrID
.
第二次修复
第 1 轮
cvc-elt.1.a: Cannot find the declaration of element 'items'.
您需要将架构正确附加到您的文档,如下所示:
<items xmlns="items" url="http://example.com/items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="items items.xsd">
因为你的schema的目标名称space是"items",所以需要声明加入xsi:schemaLocation
值,预计是一个名称[=71] =] uri,后跟 space,然后是模式文件 url.
此外,您的 <items>
元素绑定到 items
名称space 因此我需要添加 xmlns="items"
声明。
第二轮
一旦你这样做了,就会出现一堆 namespaces 错误,因为你还没有在 item
和 user
-输入中的相关元素XML.
一种方法是修复您的 XML 文档,如下所示(注意 <item>
和 <user>
上的 XML 名称space 声明:
<?xml version="1.0" encoding="UTF-8"?>
<items xmlns="items" url="http://example.com/items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="items items.xsd">
<item id_item="AR0000" xmlns="item">
<title>
Item title
</title>
<description>
Item description
</description>
<comments>
<comment id_user="A00000" id_item="AR0000">
<comment_text>
Text
</comment_text>
</comment>
</comments>
</item>
<users>
<user id_user="A00000" xmlns="user">
<alias>
User1 alias
</alias>
<email>
user1@gmail.com
</email>
</user>
<user id_user="A00001" xmlns="user">
<alias>
User2 alias
</alias>
<email>
user2@hotmail.com
</email>
</user>
</users>
</items>
还有一些关于属性声明和 ID/IDREFs 的问题我让你解决。
.
您不能将两个架构文档合并为一个架构文档,因为它们具有不同的目标名称空间。但也许那不是你想要做的:@potame 似乎对这个问题的理解完全不同。
我有两个不同的 .xsd("item" 和 "user"),我想将它们合并为一个 .xsd 使用导入:这个新模式( items.xsd) 将有一个项目序列和一个用户。
问题是我在调用我之前在命名空间中定义的类型的行中遇到此错误:
src-resolve: Cannot resolve the name 'i:item' to a(n) 'type definition' component.
此外,在 xml 中,我在根元素上收到此错误:
cvc-elt.1.a: Cannot find the declaration of element 'items'.
item.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="item"
xmlns="item" elementFormDefault="qualified">
<xsd:simpleType name="itemID">
<xsd:restriction base="xsd:ID">
<xsd:pattern value="AR[0-9][0-9][0-9][0-9]"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="item" xmlns:i="item">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="description">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="40"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="comments">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="comment" minOccurs="0" maxOccurs="100">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="comment_text">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="75"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="id_user" type="xsd:IDREF" use="required"/>
<xsd:attribute name="id_item" type="xsd:IDREF" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
user.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="user" elementFormDefault="qualified" xmlns="user">
<xsd:simpleType name="usrID">
<xsd:restriction base="xsd:ID">
<xsd:pattern value="[A-Z][0-9][0-9][0-9][0-9][0-9]"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="user" xmlns:u="user">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="alias" type="xsd:string"/>
<xsd:element name="email" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id_user" type="userID" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
items.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:i="item"
xmlns:u="user" targetNamespace="items" elementFormDefault="qualified">
<xsd:import namespace="item" schemaLocation="item.xsd" />
<xsd:import namespace="user" schemaLocation="user.xsd" />
<xsd:element name="items">
<xsd:complexType>
<xsd:sequence>
<!-- ERROR HERE --> <xsd:element name="item" type="i:item" minOccurs="1" maxOccurs="unbounded"/>
<xsd:element name="users">
<xsd:complexType>
<xsd:sequence>
<!-- ERROR HERE --> <xsd:element name="user" type="u:user" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
<xsd:attribute name="url" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
items.xml
<!-- ERROR HERE --><items url="http://example.com/items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="items.xsd">
<item id_item="AR0000">
<title>
Item title
</title>
<description>
Item description
</description>
<comments>
<comment id_user="A00000" id_item="AR0000">
<comment_text>
Text
</comment_text>
</comment>
</comments>
</item>
<users>
<user id_user="A00000">
<alias>
User1 alias
</alias>
<email>
user1@gmail.com
</email>
</user>
<user id_user="A00001">
<alias>
User2 alias
</alias>
<email>
user2@hotmail.com
</email>
</user>
</users>
</items>
第一次修复
src-resolve: Cannot resolve the name 'i:item' to a(n) 'type definition' component.
您只想使用已在其他架构中定义的元素。因此你应该使用 <xsd:element ref="...">
.
您可以像这样更改 <!-- ERROR HERE -->
附近的声明(在 items.xsd 架构中):
<xsd:element ref="i:item" minOccurs="1" maxOccurs="unbounded"/>
和
<xsd:element ref="u:user" minOccurs="1" maxOccurs="unbounded"/>
因为在 <xsd:element>
上使用类型会假定您在其他地方定义了 xsd:simpleType
或 xsd:complexType
。
请注意 user.xsd 中有一个拼写错误:您指的是一个名为 userID
的类型,但我认为正确的拼写是 usrID
.
第二次修复
第 1 轮
cvc-elt.1.a: Cannot find the declaration of element 'items'.
您需要将架构正确附加到您的文档,如下所示:
<items xmlns="items" url="http://example.com/items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="items items.xsd">
因为你的schema的目标名称space是"items",所以需要声明加入xsi:schemaLocation
值,预计是一个名称[=71] =] uri,后跟 space,然后是模式文件 url.
此外,您的 <items>
元素绑定到 items
名称space 因此我需要添加 xmlns="items"
声明。
第二轮
一旦你这样做了,就会出现一堆 namespaces 错误,因为你还没有在 item
和 user
-输入中的相关元素XML.
一种方法是修复您的 XML 文档,如下所示(注意 <item>
和 <user>
上的 XML 名称space 声明:
<?xml version="1.0" encoding="UTF-8"?>
<items xmlns="items" url="http://example.com/items" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="items items.xsd">
<item id_item="AR0000" xmlns="item">
<title>
Item title
</title>
<description>
Item description
</description>
<comments>
<comment id_user="A00000" id_item="AR0000">
<comment_text>
Text
</comment_text>
</comment>
</comments>
</item>
<users>
<user id_user="A00000" xmlns="user">
<alias>
User1 alias
</alias>
<email>
user1@gmail.com
</email>
</user>
<user id_user="A00001" xmlns="user">
<alias>
User2 alias
</alias>
<email>
user2@hotmail.com
</email>
</user>
</users>
</items>
还有一些关于属性声明和 ID/IDREFs 的问题我让你解决。 .
您不能将两个架构文档合并为一个架构文档,因为它们具有不同的目标名称空间。但也许那不是你想要做的:@potame 似乎对这个问题的理解完全不同。