2010-11-19 33 views
6

tôi đang cố gắng để xác định một quy tắc chương trình trong XSD, mà một chuỗi dài 8 ký tự:XSD mẫu biểu thức chính quy: này hoặc không có gì

<PostedDate>42183296</PostedDate> 

và không gian-điền cũng được phép:

<PostedDate>  </PostedDate> 

đó dẫn tôi đến XSD:

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

nhưng giá trị thể cũng có e mpty (tức là zero ký tự):

<PostedDate></PostedDate> 
<PostedDate /> 

đó dẫn tôi đến ngây thơ thử:

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

Trong đó tất nhiên là không được phép.

Như thường là trường hợp trong XSD, hầu hết các định dạng không thể được biểu diễn một cách dễ dàng với XSD, vì vậy tôi đã lựa chọn để thử một quy tắc biểu thức chính quy:

.{8} | "" 

mà cố gắng để chuyển đổi sang XSD tôi gõ:

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

Nhưng nó đã không làm việc:

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

tôi cũng đã cố gắng

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

Can điều bất cứ ai khác trong một mô hình giải quyết vấn đề phù hợp với một trong hai - một số mô hình cụ thể - trống

Bonus: thể bất kỳ ai trỏ đến địa điểm ở the XSD documentation cho biết rằng \d là chữ số phù hợp? Hoặc các mã mẫu đặc biệt khác là gì?

+0

Tôi nghĩ rằng '\ d {8}? 'Nên hoạt động. '?' có nghĩa là bất cứ điều gì trước khi nó là tùy chọn. –

Trả lời

11

Tôi có thể đoán rằng các patters sẽ trông giống như \d{8}| có nghĩa là "tám chữ số hoặc không có gì", nhưng không phải tám chữ số hoặc hai dấu ngoặc kép. Tuy nhiên điều này không giải thích, tại sao 20101111 không khớp. Bạn có chắc chắn rằng không có khoảng trắng hoặc các biểu tượng bổ sung khác trong giá trị phần tử không?
\d được cho là khớp với các chữ số trong phần "F.1.1 Ký tự loại Escapes"

+0

Đó là mẹo tôi sẽ không bao giờ tìm ra '\ d {8} |' có nghĩa là * "tám chữ số | không có gì" *. Lén lút. Và bạn nói đúng; tôi không biết tại sao mẫu của tôi '. {8} | ''' không khớp với '20101111' trước đây - nó hiện nay.Mặc dù trước đây tôi đã sử dụng trang web để xác thực xml + xsd. Kể từ giờ ăn trưa tôi đã viết một chương trình xml-studio để cung cấp thêm phản hồi tương tác. –

+2

Điều quan trọng cần lưu ý là hạn chế 'xs: totalDigits' phải đến ** sau ** giới hạn' xs: pattern'. Nếu không, trình phân tích cú pháp nội bộ chuyển đổi văn bản '000001' thành chữ số duy nhất' 1', sau đó không hợp lệ hóa với mẫu '(\ d) {6}', vì nó không dài 6 ký tự! –

3

Tôi cũng trong tình huống tương tự như chuỗi rỗng được cho phép nếu không nó phải 6 số chiều dài. Cuối cùng tôi sử dụng như sau. Điều này phù hợp với tôi

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="|[0-9]{8}" /> 
    </xs:restriction> 
</xs:simpleType> 
Các vấn đề liên quan