给出以下代表性片段:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:j="http://foo" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://foo" elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.2">
<xs:element name="Event">
<xs:annotation>
<xs:documentation>The Incident beginning and end date and time</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:complexContent>
<xs:extension base="j:EventType"/>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:complexType name="EventType">
<xs:sequence>
<xs:element ref="j:EventDate" minOccurs="0"/>
<xs:element ref="j:EventTime" minOccurs="0"/>
</xs:sequence>
<xs:attribute ref="j:EventType" use="required"/>
</xs:complexType>
<xs:attribute name="EventType">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Beginning"/>
<xs:enumeration value="Ending"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
以下XML未验证。具体来说,它不会验证EventType属性。
<?xml version="1.0" encoding="utf-8"?>
<SomeDoc xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://hostedbykarpel.com/Schemas/ReferralDocument_2">
<Event EventType="TypeOne">
<EventDate>2013-12-18</EventDate>
<EventTime>00:15:28</EventTime>
</Event>
</SomDoc>
但是,如果我在元素中明确添加命名空间,那么它可以工作:
<Event a:EventType="TypeOne" xmlns:a="http://foo">
<EventDate>2013-12-18</EventDate>
<EventTime>00:15:28</EventTime>
</Event>
命名空间已在文档的根目录中声明。为什么我需要再次指定它才能显示属性? Event元素本身验证就好了,它只是不会的EventType属性。
答案 0 :(得分:1)
我认为此行为是由ref
引用的命名属性的规范定义的。我不相信有办法改变它。但是,您可以通过不使用ref
来解决问题。
<xs:complexType name="EventElement">
...
<xs:attribute name="EventType" type="j:EventTypeValue" use="required"/>
...
</xs:complexType>
...
<xs:simpleType name="EventTypeValue">
...
</xs:simpleType>