2017-03-09 57 views
2

我寫了許多斷言來比較XSD 1.1中的日期對,但沒有一個工作。XSD 1.1斷言來比較日期

例子:

INPUT

<Records content-date="2006-05-04T18:13:51.0Z"> 

<Record issuance-date="2006-05-04T18:13:51.0Z" 
    last-update-date="2006-05-04T18:13:51.0Z" 
    last-renewal-date="2006-05-04T18:13:51.0Z" > 
</Record> 

<Record issuance-date="2006-05-04T18:13:51.0Z" 
    last-update-date="2006-05-04T18:13:51.0Z" last-renewal-date="2006-05-04T18:13:51.0Z"> 
    <Event event-date="2006-05-04T18:13:51.0Z" event-type="INITIAL_REGISTRATION"> 
    </Event> 
    </Record> 
</Records> 

XSD 1.1斷言:

<xs:assert id="plausibility-issuance-date-plausibility" 
     test="@issuance-date &lt; ./@content-date"/> 

<xs:assert id="plausibility-file-and-record-timezones" 
     test="timezone-from-dateTime(Record/@issuance-date) = timezone-from-dateTime([email protected])"/> 

已經對datetime和時區表示讀了我一點點不堪重負。

誰能告訴我:

  • 到哪裏都是在錯誤(我希望這是清楚我想要比較)?
  • 有沒有一組這樣簡單的例子,使它更易於遵循?

回答

1

XS:斷言XPATH它不是正確的,因爲它是assumming是issuance-datecontent-date是相同的元素的屬性,但事實並非如此。

您可以使用斷言這個樣本XPATH地說, 「沒有記錄issuance-date比其父content-date大於或等於」:

empty(Record[@issuance-date ge ../@content-date]) 

示例XSD:

<xs:element name="Records"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Record" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:attribute name="issuance-date" type="xs:dateTime"/> 
        <xs:attribute name="last-update-date" type="xs:dateTime"/> 
        <xs:attribute name="last-renewal-date" type="xs:dateTime"/> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
     <xs:attribute name="content-date" type="xs:dateTime"/> 
     <xs:assert id="plausibility-issuance-date-plausibility" test="empty(Record[@issuance-date ge ../@content-date])"/> 
    </xs:complexType> 
</xs:element> 
+0

謝謝,我會在選擇答案之前確認此事 - 但時區比較如何?任何想法這裏有什麼錯誤? – Michael

+1

類似的東西似乎與時區比較測試有問題,所以解決方案應該是類似的。我認爲'empty(Record [timezone-from-dateTime(@ issuance-date)!= timezone-from-dateTime(../@content-date)])'應該可以工作,但我現在無法測試它 – sergioFC