2014-09-23 21 views
5

Giả sử tôi có một tập tin XML trông như thế này:Làm thế nào một lược đồ XML có thể yêu cầu các phần tử được sắp xếp theo thuộc tính?

<Transactions> 
<Transaction OrderID="5"> ... </Transaction> 
<Transaction OrderID="6"> ... </Transaction> 
<Transaction OrderID="11"> ... </Transaction> 
<Transaction OrderID="7"> ... </Transaction> 
</Transactions> 

Sử dụng lược đồ XML, là nó có thể chỉ ra rằng thứ tự # 11 không nằm trong chuỗi có đúng không? Mỗi phần tử Giao dịch đều được xác thực riêng, nhưng OrderID phải theo thứ tự tăng dần.

Và, một câu hỏi có liên quan: Quy tắc xác thực có thể cho biết số liệu có thể bỏ qua không? Ví dụ, không có giao dịch # 8,9, hoặc 10

Trả lời

1

Nếu validator của bạn hỗ trợ XSD 1.1, bạn có thể sử dụng xs: khẳng định từ chối giá trị thuộc tính nhất định như thế này:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified" 
      vc:minVersion="1.1"> 
    <xs:element name="Transactions"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Transaction" maxOccurs="unbounded"> 
       <xs:complexType mixed="true"> 
        <xs:attribute name="OrderID" type="xs:integer"/> 
        <xs:assert test="empty(index-of((8,9,10),@OrderID))"/> 
       </xs:complexType>         
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

nên này trả lời câu hỏi thứ hai của bạn.

Đối với câu hỏi đầu tiên của bạn, tôi không nghĩ rằng xác thực đơn đặt hàng là có thể. Tuy nhiên, bạn có thể sử dụng XSLT để sắp xếp tài liệu XML.

----- thêm câu trả lời cho câu hỏi đầu tiên -----

Cảm ơn bạn, Michael Kay. Vâng ... đây là câu trả lời cho câu hỏi đầu tiên của bạn.

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Transactions"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Transaction" maxOccurs="unbounded"> 
        <xs:complexType mixed="true"> 
         <xs:attribute name="OrderID" type="xs:integer"/> 
         <xs:assert test="empty(index-of((8,9,10),@OrderID))"/> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:assert test="every $x in Transaction satisfies 
          (empty($x/preceding-sibling::*) or 
          ($x/@OrderID gt $x/preceding-sibling::*[1]/@OrderID))"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
+2

Có, xác thực đơn đặt hàng là có thể. Ví dụ '' –

+0

Cảm ơn Chong Lip Phang. Thành thật mà nói, tôi không hiểu câu trả lời của bạn đủ tốt để biết liệu nó có giải quyết được vấn đề của tôi hay không. Khi bạn viết có lẽ là 8,9,10 tham chiếu đến các giá trị cụ thể của OrderID? Tệp tôi đang làm việc có khoảng 30 nghìn giao dịch trong đó. Bất kỳ phương thức nào phù hợp với tôi sẽ cần phải hoạt động mà không cần tham chiếu đến các giá trị cụ thể cho OrderID. Bài kiểm tra Selecter

+0

Có, sẽ khiến xác thực thất bại nếu giá trị của OrderID là 8,9 hoặc 10. Nếu dữ liệu XML là rất nhiều, sau đó bạn có thể cần một quy tắc để phù hợp với một mẫu cụ thể. Việc xác thực sẽ vẫn vượt qua nếu bạn bỏ qua quy tắc xác nhận này và OrderID bỏ qua 8,9 hoặc 10. –

Các vấn đề liên quan