Lược đồ XML: Phần tử có thuộc tính chỉ chứa văn bản?


133

Tôi đang gặp khó khăn trong việc tìm kiếm này. Làm cách nào để xác định một phần tử trong tệp lược đồ XML cho XML trông như thế này:

<option value="test">sometext</option>

Tôi không thể tìm ra cách xác định một yếu tố thuộc loại xs:stringvà cũng có một thuộc tính.

Đây là những gì tôi đã có cho đến nay:

<xs:element name="option">
    <xs:complexType>
        <xs:attribute name="value" type="xs:string" />
    </xs:complexType>
</xs:element>

Câu trả lời:


168

Thử

  <xs:element name="option" type="AttrElement" />

  <xs:complexType name="AttrElement">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="value" type="xs:string">
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

Tôi nhận được một ngoại lệ sau khi thử mã của bạn - org.xml.sax.SAXPudeException: src-giải quyết: Không thể thực hiện tên 'AttrEuity' thành một thành phần (n) 'định nghĩa loại'. Tại sao lại như vậy?
Ashwin

1
Nếu đó là như vậy, có thể là do tài liệu lược đồ của bạn có một không gian tên đích và bạn sẽ cần sử dụng một tên tiền tố để trỏ đến loại. (Nếu tiền tố tnsđược liên kết với không gian tên đích của tài liệu lược đồ, bạn sẽ sử dụng type="tns:AttrElement"để tham chiếu loại.)
CM Sperberg-McQueen

@Ashwin bạn có thể cần tham chiếu loại với không gian tên loại ( type="tns:AtrElement"nếu không gian tên mặc định của XSD không phải là không gian đích của tài liệu. Thông thường trong trường hợp đó tnsđược xác định và sử dụng.
eckes

75

... hoặc tương đương nội tuyến:

<xs:element name="option">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="value" type="xs:string" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

11
Tôi thấy nó thực sự không trực quan để định nghĩa simpleContenttrong a complexType. Nhưng một lần nữa, đó là XSD, nơi không có gì thực sự trực quan. Dù sao cũng cảm ơn! :-)
cúm

Điều này sẽ hiển thị lỗi cho tôi trong IntelliJ ( V12.1.3 ): Thuộc tính giá trị là "không được phép". Sử dụng ComplexContent thay vì SimpleContent đã sửa nó.
aZen

@CrBruno tốt hơn nên mở một câu hỏi SO dành riêng cho việc này. Vui lòng liên kết với nó ở đây trong các bình luận (và chỉ ra sự dồn dập này)
eckes

-2

Tôi biết nó không giống nhau, nhưng nó hoạt động với tôi:

<xsd:element name="option">
    <xsd:complexType mixed="true">
        <xsd:attribute name="value" use="optional" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.