2009-03-17 8 views
15

Có cách nào hợp lý để có các thành phần có kiểu đơn giản và cũng thuộc tính không?XSD: Thêm thuộc tính vào các yếu tố "đơn giản" được nhập mạnh mẽ

Được rồi, tôi có một lược đồ XSD trong đó có một triệu (er, trăm) yếu tố mà có thể trông như thế này:

<xsd:element name="DocumentDescription" type="xsd:string" /> 
<xsd:element name="DocumentDateTime" type="xsd:dateTime" /> 
<xsd:element name="DocumentSize" type="xsd:int" /> 

Đó là dandy. Tuy nhiên, tôi thực sự muốn tất cả các yếu tố này cũng có một số thuộc tính phổ biến trên chúng như, giả sử, "định dạng" và "isVisible". tức là có một schema như:

<DocumentDescription isVisible="true">doc description</DocumentDescription> 
<DocumentDateTime format="dd/mm/yyyy" isVisible="true">1/1/2008</DocumentDescription> 
<DocumentSize format="0.00 KB" isVisible="false">5403</DocumentSize> 

tôi có thể làm điều đó bằng tay, và khủng khiếp, bằng cách thêm tất cả các thuộc tính đó cho XSD khi tôi tạo ra nó, một cái gì đó như thế này:

<xsd:element name="DocumentDescription" /> 
    <xsd:complexType> 
    <xsd:simpleContent> 
     <xsd:extension base="xsd:string"> 
     <xsd:attribute name="format" type="xsd:string" /> 
     <xsd:attribute name="isVisible" type="xsd:boolean" /> 
     </xsd:extension> 
    </xsd:simpleContent> 
    </xsd:complexType> 
<xsd:element name="DocumentDateTime" /> 
    ... etc 

... nhưng trong một thế giới lý tưởng tôi thà xác định nó như là một complexType:

<xsd:complexType name="customType"> 
    <xsd:complexContent> 
    <xsd:extension base="???"> 
     <xsd:attribute name="format" type="xsd:string" /> 
     <xsd:attribute name="isVisible" type="xsd:boolean" /> 

... có nghĩa là tôi chỉ có thể làm:

<xsd:element name="DocumentDescription" type="customType" baseType="xsd:string" /> 
<xsd:element name="DocumentDateTime" type="customType" baseType="xsd:dateTime" /> 
<xsd:element name="DocumentSize" type="customType" baseType="xsd:int" /> 

Vấn đề với tôi mã "thế giới lý tưởng" là:

a) Tôi đã không hợp lệ <xsd:extension base-"???">, vì thực sự tôi không quan tâm những gì tôi đang mở rộng; Tôi muốn mở rộng tất cả các loại. Có vẻ như "xsd: anyType" là thích hợp, nhưng sau đó phần tử trở thành một container được đánh máy yếu không?

b) Tôi không còn có thể chỉ định loại đơn giản trên <xsd:element>, vì bây giờ loại này là "customType" phức tạp mà tôi đã xác định. Do đó, thuộc tính "baseType" tưởng tượng mà tôi đặt ở đó ...

Vì vậy, tôi có thể thêm thuộc tính vào các loại đơn giản theo cách không clunky? Hoặc tôi có cần phải xác định một tá các loại phức hợp giống hệt nhau ngoại trừ loại đơn giản mà chúng mở rộng không?

Các yếu tố được đánh máy không chỉ mô tả dữ liệu hợp lý hơn, mà khi tôi sử dụng chúng để lập bản đồ XML trong Excel (và đây là toàn bộ mục đích đằng sau những thứ này). dựa trên loại.

Tôi có thể đang xem xét mọi thứ sai trái! Bất kỳ lời khuyên nào được đánh giá cao.

+0

Tôi đã hủy một phiên bản đổi tên tất cả các lần xuất hiện của _strongly-type_ với _built-in simple types_ ([W3C wording] (http: //www.w3 .org/TR/2004/REC-xmlschema-0-20041028/primer.html # simpleTypesTable)). Một từ ngữ như vậy sẽ giúp tôi tìm ra câu hỏi của bạn. Bây giờ tôi không chắc rằng bản chỉnh sửa là xứng đáng và tôi hài lòng với nhận xét của tôi bao gồm từ ngữ này, vì vậy tôi có thể tìm thấy câu hỏi của bạn một lần nữa trong tương lai. – Alberto

Trả lời

3

[quote] có thể làm điều đó bằng tay, và khủng khiếp, bởi thêm tất cả các thuộc tính đó cho XSD khi tôi tạo ra nó, một cái gì đó giống như này: [/ quote]

Tôi e rằng đây là cách tương thích với lược đồ XSD "thích hợp" duy nhất của bạn để làm điều đó.

XSD có thể phức tạp với tác giả vào những thời điểm - nhưng nó giúp giữ mọi thứ an toàn :-)

Marc

+0

Chết tiệt! Vâng, cảm ơn. Tôi có thể cung cấp cho tá giống hệt nhau-ngoại trừ-cho-mở rộng-complexTypes một đi đầu tiên mặc dù, cho số lượng các yếu tố nó ít nhất sẽ làm cho XSD nhỏ hơn, mặc dù xấu xí! – Gavin

+1

@Gavin Thật đáng để xem xét đề xuất 'attributeGroup' của [C. M. Sperberg-McQueen] (http://stackoverflow.com/a/14497740/413020) nếu bạn luôn thêm cùng một tập hợp các thuộc tính – Alberto

1

Mục đích của một XSD là để mô tả dữ liệu của bạn. Mục đích của thuộc tính type XSD là mô tả hoặc định nghĩa một phần tử.Những gì bạn muốn làm là thay đổi định nghĩa của phần tử. Nếu bạn thay đổi mô tả, hãy thay đổi loại. Những gì bạn đang cố gắng làm cũng giống như đặt bánh xe vào một ý nghĩ. "Nhưng tôi muốn bánh xe theo suy nghĩ của tôi!" "Xin lỗi, không thể làm được."

4

Không hoàn toàn rõ ràng khía cạnh nào của giải pháp thủ công mà bạn coi là khủng khiếp; nếu đó là ý tưởng phải xác định n các loại khác nhau chỉ vì chúng sẽ cần mở rộng n các loại cơ sở khác nhau, thì bạn bị kẹt.

Nếu đó là ý tưởng của việc phải có n tờ khai khác nhau cho các formatisVisible thuộc tính, sau đó bạn có thể tìm thấy nó ít khủng khiếp để sử dụng một nhóm thuộc tính được đặt tên để giữ những định nghĩa:

<xs:attributeGroup name="globals"> 
    <xs:attribute name="format" type="xs:string"/> 
    <xs:attribute name="isVisible" type="xs:boolean"/> 
</xs:attributeGroup> 

Các các khai báo về các loại phức tạp khác nhau mà bạn cần vẫn lặp lại nhưng hiện nay hơi kém tiết hơn:

<xs:complexType name="string"> 
    <xs:simpleContent> 
    <xs:extension base="xs:string"> 
     <xs:attributeGroup ref="my:globals"/> 
    </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 
<xs:complexType name="dateTime"> 
    <xs:simpleContent> 
    <xs:extension base="xs:dateTime"> 
     <xs:attributeGroup ref="my:globals"/> 
    </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 
<xs:complexType name="int"> 
    <xs:simpleContent> 
    <xs:extension base="xs:int"> 
     <xs:attributeGroup ref="my:globals"/> 
    </xs:extension> 
    </xs:simpleContent> 
</xs:complexType> 

Và khai báo các yếu tố của bạn bây giờ là đơn giản hơn trong trường hợp 'lý tưởng' của bạn:

<xs:element name="DocumentDescription" type="my:string" /> 
<xs:element name="DocumentDateTime" type="my:dateTime" /> 
<xs:element name="DocumentSize" type="my:int" /> 
+0

Trong XSD 1.1 có một thuộc tính lược đồ được gọi là 'defaultAttributes' áp dụng một nhóm thuộc tính cho mọi complexType trừ khi 'defaultAttributesApply' được đặt thành false trong complexType đó. Điều này không làm việc cho simpleTypes nhưng sử dụng cách tiếp cận tuyệt vời của bạn, bạn phải writte hai dòng ít hơn cho mỗi khai báo complexType vì phần mở rộng có thể là một thẻ tự đóng '' – sergioFC