XSD 导入元素名称冲突
XSD import with element name clash
我正在尝试将来自不同来源的两个 XSD 文件放在一起,其中一个元素名称存在名称冲突。使用这些 XSD 文件创建 XML 文件时,我收到错误消息
"Element title is not allowed here"
其中 title 是导致名称冲突的元素名称。
这是第一个XSDMeldeamt.xsd
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://services.meldeamt.gov.at/people"
xmlns="http://services.meldeamt.gov.at/people"
version="2.1">
<xsd:element name="title">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="citizen"/>
<xsd:enumeration value="immigrant"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:schema>
这里是第二个XSDCalTech.xsd
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.caltech.at/hr"
xmlns="http://www.caltech.at/hr"
xmlns:registry="http://services.meldeamt.gov.at/people"
version="2.1">
<xsd:import schemaLocation="Meldeamt.xsd" namespace="http://services.meldeamt.gov.at/people" />
<xsd:element name="CalTech">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Staff"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Staff">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Employee"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Employee">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="firstName"/>
<xsd:element ref="name"/>
<xsd:element ref="title" />
<xsd:element ref="registry:title"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
<xsd:element name="title" type="xsd:string">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Ph.D." />
<xsd:enumeration value="Master" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="firstName" type="xsd:string"/>
<xsd:element name="name" type="xsd:string"/>
</xsd:schema>
这里是 Test.xml 使用上面的 XSDs:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<cal:CalTech xmlns:cal="http://www.caltech.at/hr"
xmlns:meldeamt="http://services.meldeamt.gov.at/people"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.caltech.at/hr CalTech.xsd
http://services.meldeamt.gov.at/people Meldeamt.xsd">
<cal:Staff>
<cal:Employee id="a471">
<cal:firstName>John</cal:firstName>
<cal:name>Connor</cal:name>
<cal:title>Ph.D.</cal:title>
<meldeamt:title>immigrant</meldeamt:title>
</cal:Employee>
</cal:Staff>
</cal:CalTech>
对于第一个标题元素 cal:title
,我收到错误消息
Element cal:title is not allowed here
我正在 IntelliJ Idea 中测试 XML。
如果我在 CalTech.xsd 和 Text.xml 中将 cal:title
的名称更改为 cal:title1
,则错误消息消失,并且一切正常,包括内容验证。
我不知道我在这里错过了什么。
您实际上在设置机器以使用命名空间以避免名称冲突方面做得很好。只需修复一个小的声明错误,一切都会好起来的...
在CalTech.xsd中,更改
<xsd:element name="title" type="xsd:string">
至
<xsd:element name="title">
因为元素声明不能同时具有 @type
属性和匿名类型子元素。
然后,您的 XML 文件将针对您的 XSD 成功验证。
顺便说一句,您应该收到的错误应该更符合 Xerces 提供的内容:
[Error] CalTech.xsd:38:47: src-element.3: Element 'title' has both a
'type' attribute and a 'anonymous type' child. Only one of these is
allowed for an element.
我正在尝试将来自不同来源的两个 XSD 文件放在一起,其中一个元素名称存在名称冲突。使用这些 XSD 文件创建 XML 文件时,我收到错误消息
"Element title is not allowed here"
其中 title 是导致名称冲突的元素名称。
这是第一个XSDMeldeamt.xsd
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://services.meldeamt.gov.at/people"
xmlns="http://services.meldeamt.gov.at/people"
version="2.1">
<xsd:element name="title">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="citizen"/>
<xsd:enumeration value="immigrant"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:schema>
这里是第二个XSDCalTech.xsd
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.caltech.at/hr"
xmlns="http://www.caltech.at/hr"
xmlns:registry="http://services.meldeamt.gov.at/people"
version="2.1">
<xsd:import schemaLocation="Meldeamt.xsd" namespace="http://services.meldeamt.gov.at/people" />
<xsd:element name="CalTech">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Staff"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Staff">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Employee"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="Employee">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="firstName"/>
<xsd:element ref="name"/>
<xsd:element ref="title" />
<xsd:element ref="registry:title"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
<xsd:element name="title" type="xsd:string">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Ph.D." />
<xsd:enumeration value="Master" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="firstName" type="xsd:string"/>
<xsd:element name="name" type="xsd:string"/>
</xsd:schema>
这里是 Test.xml 使用上面的 XSDs:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<cal:CalTech xmlns:cal="http://www.caltech.at/hr"
xmlns:meldeamt="http://services.meldeamt.gov.at/people"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.caltech.at/hr CalTech.xsd
http://services.meldeamt.gov.at/people Meldeamt.xsd">
<cal:Staff>
<cal:Employee id="a471">
<cal:firstName>John</cal:firstName>
<cal:name>Connor</cal:name>
<cal:title>Ph.D.</cal:title>
<meldeamt:title>immigrant</meldeamt:title>
</cal:Employee>
</cal:Staff>
</cal:CalTech>
对于第一个标题元素 cal:title
,我收到错误消息
Element cal:title is not allowed here
我正在 IntelliJ Idea 中测试 XML。
如果我在 CalTech.xsd 和 Text.xml 中将 cal:title
的名称更改为 cal:title1
,则错误消息消失,并且一切正常,包括内容验证。
我不知道我在这里错过了什么。
您实际上在设置机器以使用命名空间以避免名称冲突方面做得很好。只需修复一个小的声明错误,一切都会好起来的...
在CalTech.xsd中,更改
<xsd:element name="title" type="xsd:string">
至
<xsd:element name="title">
因为元素声明不能同时具有 @type
属性和匿名类型子元素。
然后,您的 XML 文件将针对您的 XSD 成功验证。
顺便说一句,您应该收到的错误应该更符合 Xerces 提供的内容:
[Error] CalTech.xsd:38:47: src-element.3: Element 'title' has both a 'type' attribute and a 'anonymous type' child. Only one of these is allowed for an element.