2009-08-20 36 views
13

Tôi có một tình huống trong đó một phần tử trong tệp XML có thể có hai loại khác nhau trong XSD.xsd cùng một yếu tố, các loại khác nhau?

Điều tôi muốn làm trước tiên là xác thực giá trị đã nhập vào loại nghiêm ngặt hơn (nếu đó là người điền vào biểu mẫu) và nếu điều đó không kéo qua, hãy xác thực nó với loại ít nghiêm ngặt hơn (nếu đó là một tổ chức điền vào biểu mẫu), nếu không thì việc xác thực không thành công nếu nó không hợp lệ.

Vì vậy, đây là cơ bản nó:

<xsd:complexType name="ForminfoType"> ` 
    <xsd:sequence> 
     <xsd:element name="formname" type="xsd:string" /> 
     <xsd:element name="timestamp" type="xsd:dateTime" /> 
     <xsd:element name="sender" type="PersonType" minOccurs="0" /> 
     <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
     <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
    </xsd:sequence> 
</xsd:complexType> 

gì PersonType tuyên bố về cơ bản là một con số 12 chữ số được xây dựng theo một mô hình cụ thể. Loại tổ chức tuyên bố về cơ bản chỉ là một số có 10 chữ số.

Vì vậy, những gì tôi một cách logic muốn làm là đặt này:

<xsd:element name="sender" type="OrganizationType" minOccurs="0" /> 

vào trình tự, nhưng bạn không thể có hai yếu tố có cùng tên và các loại khác nhau. Vì vậy, tôi nghĩ tôi phải giải quyết nó theo cách khác.

Những gì tôi đã tìm thấy được điều này: http://xsd.stylusstudio.com/2007Oct/post05003.htm

Đó là khá nhiều những gì tôi muốn làm, nhưng tôi không chắc chắn nó có thể. Có ai có thêm ý tưởng nào về cách giải quyết vấn đề này không?

Xin cảm ơn trước.

+2

Bạn không muốn sử dụng backticks cho đa dòng mã. Chỉ cần chọn các dòng và sử dụng Control-K. –

+1

@Arizon: để định dạng mã đúng, tô sáng nó và sau đó nhấp vào nút có số 0 và số (01010 0101010) trong thanh công cụ phía trên trình chỉnh sửa! –

Trả lời

11

Không, bạn không thể thực sự làm điều này. Một lựa chọn bạn có nó để tạo ra một "PersonOrOrgSender" loại phức tạp dọc theo dòng:

<xsd:complexType name="PersonOrOrgType"> 
    <xsd:choice> 
     <xsd:element minOccurs="0" name="PersonSender" type="PersonType" /> 
     <xsd:element minOccurs="0" name="OrgSender" type="OrganizationType" /> 
    </xsd:choice> 
    </xsd:complexType> 

và sau đó làm cho "người gửi" của bạn một thể hiện của kiểu đó:

<xsd:element name="sender" type="PersonOrOrgType" minOccurs="0" /> 

nhưng sau đó bạn sẽ có dữ liệu XML như thế này:

<FormInfo> 
    <formname>string</formname> 
    <sender> 
    <OrgSender> 
     <Name>string</Name> 
    </OrgSender> 
    </sender> 
    ... 
</FormInfo> 

hoặc

<FormInfo> 
    <formname>string</formname> 
    <sender> 
    <PersonSender> 
     <Name>string</Name> 
    </PersonSender> 
    </sender> 
    ... 
</FormInfo> 

Bạn không thể tạo một thẻ (ví dụ: "người gửi") là một điều trong một trường hợp và một điều khác trong một trường hợp khác - một thẻ phải có chính xác một loại được xác định rõ ràng và có loại đó một lần và cho mọi thời đại.

Marc

+0

Marc, Cảm ơn bạn rất nhiều, rất tiếc là tôi đã gặp sự cố khác, Phần tử người gửi không được phép có nút con, vì vậy tôi đã giải quyết nó bằng cách thêm "hoặc" và mẫu tổ chức vào PersonType. "| [0-9] {10}" liên quan, Erik –

1

Với vấn đề của bạn với các giải pháp được cung cấp bởi @mark_s, bạn có nhiều lựa chọn:

  • Tạo hai XSD riêng biệt với hai loại cho sender. Trong mã của bạn kích hoạt xác thực, hãy chạy chúng tuần tự (nghĩa là người đó sau đó tổ chức). Điều này có lợi ích bổ sung là mã của bạn sẽ biết xác thực nào đã qua (và có thể đưa ra các lựa chọn dựa trên kiến ​​thức đó).
  • Di chuyển lựa chọn lên một cấp trong XSD. Bên trong ForminfoType, thêm nút chọn lựa với hai chuỗi (một người, một tổ chức).Tôi đã không xác nhận, nhưng đại khái là:

    <xsd:complexType name="ForminfoType"> 
        <xsd:choice> 
         <xsd:sequence> <!-- person --> 
          <xsd:element name="formname" type="xsd:string" /> 
          <xsd:element name="timestamp" type="xsd:dateTime" /> 
          <xsd:element name="sender" type="PersonType" minOccurs="0" /> 
          <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
         </xsd:sequence> 
         <xsd:sequence> <!-- organization --> 
          <xsd:element name="formname" type="xsd:string" /> 
          <xsd:element name="timestamp" type="xsd:dateTime" /> 
          <xsd:element name="sender" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="receiver" type="OrganizationType" minOccurs="0" /> 
          <xsd:element name="signature" type="xsd:string" minOccurs="0" /> 
         </xsd:sequence> 
        </xsd:choice> 
    </xsd:complexType> 
    
Các vấn đề liên quan