2009-04-23 17 views
17

Tôi đang cố gắng để tạo ra một sơ đồ cho một yếu tố <property> mà phải có một tiểu yếu tố <key>, và là một trong <val>, <shell> hoặc <perl> và một tùy chọn <os> hoặc <condition>, và thứ tự của các phần tử con không quan trọng .Lược đồ XML: Tại sao không thể <xs:all> có <choice> trẻ em? và làm thế nào điều này có thể được bỏ qua?

Dưới đây là một số mẫu cho <property> yếu tố hợp lệ:

<property> 
    <key>A</key> 
    <val>b</val> 
</property> 

<property> 
    <key>A</key> 
    <val>b</val> 
    <os>Windows</os> 
</property> 

<property> 
    <condition>a == 1</condition> 
    <key>A</key> 
    <perl>1+1</perl> 
    <os>unix</os> 
</property> 

Lý tưởng nhất, tôi nghĩ đến việc sử dụng <xs:all> cho việc này:

<xs:element name="property"> 
    <xs:complexType> 
    <xs:all> 
     <xs:element name="key" type="xs:string" /> 
     <xs:choice> 
     <xs:element name="val" type="xs:string" /> 
     <xs:element name="perl" type="xs:string" /> 
     <xs:element name="shell" type="xs:string" /> 
     </xs:choice> 
     <xs:element name="os" type="xs:string" minOccurs="0" /> 
     <xs:element name="condition" type="xs:string" minOccurs="0" /> 
    </xs:all> 
    </xs:complexType> 
</xs:element> 

Nhưng tôi phát hiện ra rằng <xs:all> có thể chứa chỉ <xs:element> và không <xs:choice> . Ai đó có thể giải thích tại sao nó?

Quan trọng hơn, ai đó có thể cung cấp cách xác thực yếu tố <property> như vậy?

tôi có thể đưa ba yếu tố - <val>, <perl><shell> - như các yếu tố bắt buộc trong <xs:all>, nhưng tôi muốn các lược đồ để xác nhận rằng một và chỉ một trong ba tồn tại trong phần tử. Điều này có thể được thực hiện?

+1

@splintor: Bạn đã thực sự xem cửa sổ xem trước khi viết câu hỏi chưa? Ý tôi là, một nửa của nó là vô hình ... – Tomalak

+0

Bạn có nghĩa là cả hai os và điều kiện có thể xảy ra trong cùng một yếu tố tài sản hoặc một hoặc khác hoặc không có thể xảy ra? –

+0

@Tomalak: Không - tôi đã bỏ lỡ cửa sổ xem trước đó. Cảm ơn rất nhiều vì đã chỉnh sửa nó để có nghĩa là những gì tôi muốn. – splintor

Trả lời

22

Tôi nghĩ rằng đây là một chút tốt hơn, là "sự lựa chọn" bây giờ là yếu tố riêng của nó (typeFacet), nhưng không thể được sử dụng trực tiếp vì nó là trừu tượng.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="property"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name="key" type="xs:string" /> 
     <xs:element ref="typeFacet" /> 
     <xs:element name="os" type="xs:string" minOccurs="0" /> 
     <xs:element name="condition" type="xs:string" minOccurs="0" /> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="typeFacet" abstract="true" /> 
    <xs:element name="val" type="xs:string" substitutionGroup="typeFacet" /> 
    <xs:element name="perl" type="xs:string" substitutionGroup="typeFacet" /> 
    <xs:element name="shell" type="xs:string" substitutionGroup="typeFacet" /> 
</xs:schema> 
+0

Vâng, đó là một cải tiến. – 13ren

+0

Vâng, đó là khá chính xác những gì tôi có nghĩa là nhưng đã quá đáp ứng để thực sự làm. Trừu tượng chắc chắn là một ý tưởng tốt ở đây. –

+0

Tuyệt vời, tôi không biết về sự thay thế trong lược đồ XSD. Điều này dường như đang làm những gì tôi cần. Cảm ơn. – splintor

6

Dựa trên nhận xét sa giông về việc sử dụng các nhóm thay thế cho các lựa chọn (thử nghiệm với xmllint):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="property"> 
    <xs:complexType> 
     <xs:all> 
     <xs:element name="key" type="xs:string" /> 
     <xs:element ref="val"/> 
     <xs:element name="os" type="xs:string" minOccurs="0" /> 
     <xs:element name="condition" type="xs:string" minOccurs="0" /> 
     </xs:all> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="val" type="xs:string"/> 
    <xs:element name="perl" type="xs:string" substitutionGroup="val" /> 
    <xs:element name="shell" type="xs:string" substitutionGroup="val" /> 
</xs:schema> 
+0

Tuyệt vời, tôi không biết về sự thay thế trong lược đồ XSD. Điều này dường như đang làm những gì tôi cần. Cảm ơn. – splintor

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