2010-11-19 30 views
6

我試圖定義(XSD)的方案規則,爲此,一個字符串是8個字符長:XSD正則表達式模式:這個或全無

<PostedDate>42183296</PostedDate> 

和空間填充也被允許:

<PostedDate>  </PostedDate> 

這使我的XSD:

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:length value="8" />   //exactly 8 characters long 
</xs:simpleType> 

但值可以也通過電子郵件空(即零個字符):

<PostedDate></PostedDate> 
<PostedDate /> 

害得我天真地嘗試:

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:length value="8" />   //exactly 8 characters long 
     <xs:length value="0" />   //exactly 0 characters long 
</xs:simpleType> 

這當然是不允許的。

正如經常在XSD的情況下,大多數的格式不能輕易與XSD代表,所以我選擇嘗試正則表達式規則:

.{8} | "" 

它試圖轉換爲xsd I型:

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value=".{8}|''" /> 
    </xs:restriction> 
</xs:simpleType> 

但它沒有工作:

''20101111' is not facet-valid with respect to pattern '.{8}|''' for type 'DateFormat' 

我也嘗試

  • <xs:pattern value="[0-9]{8}|''" />
  • <xs:pattern value="([0-9]{8})|('')" />
  • <xs:pattern value="(\d{8})|('')" />

可以在解決了只要符合 問題的模式的其他任何人的東西 - 一些特定的模式 - 空

獎勵:能任何人都指向的地方表示\d與數字相符?或者其他特殊模式代碼是什麼?

+0

我認爲'\ d {8}?'應該工作。 '?'意味着任何之前它是可選的。 – 2012-08-16 04:10:04

回答

11

我可能猜想,模式應該看起來像\d{8}|這意味着「八位數或沒有」,但不是八位數或兩個引號。但是這並不能解釋爲什麼20101111不匹配。你確定元素值中沒有空格或其他附加符號嗎?
\d據說以匹配部分「F.1.1字符類逃逸」數字

+0

這就是我從未想出過的技巧'\ d {8} |'手段*「八位數|無」*。偷偷摸摸的。你說得對;我不知道爲什麼我的模式'。{8} |'''與之前的'20101111'不匹配 - 現在就這樣。雖然之前我使用網站來驗證xml + xsd。自午餐時間以來,我編寫了一個xml-studio程序來提供更多的互動反饋。 – 2010-11-19 20:06:11

+2

注意'xs:totalDigits'限制必​​須在** xs:pattern'限制之後**。否則,解析器會在內部將文本「000001」轉換爲單個數字「1」,由於它不是6個字符,因此無法驗證模式「(\ d){6}」! – 2010-11-19 21:14:09

3

我也喜歡在空字符串相同的情況是允許否則它必須6個長度的數字。最後我用瞭如下。這適用於我

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="|[0-9]{8}" /> 
    </xs:restriction> 
</xs:simpleType>