2013-12-18 172 views
-1

鑑於以下代表性片段:XML沒有驗證對XSD

<?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

請發佈一個「代表性片段」,它可以自己站立以便於複製您的問題。您的XSD引用不存在的元素「j:EventDate」和「j:EventTime」。 – kjhughes

+0

@kjhuges這會爲樣本增加50行。這些可以很容易地用字符串類型替換。問題與此無關。它也證明這不是一個問題,更多的是與XML規範相沖突。見Michael Gunter的回答。 – kettch

+1

我沒有聲稱這是你的問題 - 只是想幫助你提高花時間幫助你的人的機率。您應該發佈展示您的問題的最小完整示例。期待我們將事情剔除出來,修正錯別字('')等等,這使我們不太可能仔細觀察。謝謝。 – kjhughes

回答

1

我認爲這個行爲是由規範定義的,用ref引用的命名屬性。我不相信有一種方法可以改變它。但是,您可以通過不使用ref來解決問題。

<xs:complexType name="EventElement"> 
    ... 
    <xs:attribute name="EventType" type="j:EventTypeValue" use="required"/> 
    ... 
</xs:complexType> 
... 
<xs:simpleType name="EventTypeValue"> 
    ... 
</xs:simpleType> 
+0

謝謝,當我開始閱讀關於attributeFormDefault的文檔時,我做出了一個錯誤的假設,並導致我廢除了整個答案。那麼,如果我沒有修改XSD的能力,是否有辦法解決這個問題? – kettch

+0

我不這麼認爲。這是由spec定義的。我可以在這裏找到最簡單的解釋 - http://msdn.microsoft.com/en-us/library/aa468564.aspx#xmlscmavdcmplx_topic04 - 但我仍然在尋找描述這一點的W3C規範。 –

+0

我忘了回來,謝謝你。你對規範的編寫方式是正確的,事實證明XSD可能無效,但這超出了我的控制範圍。當我生成XML時,它只需要一些體操,至少可以使一切正常。 – kettch