XML Schema: องค์ประกอบที่มีแอตทริบิวต์ที่มีเฉพาะข้อความ?


136

ฉันมีปัญหาในการค้นหาสิ่งนี้ ฉันจะกำหนดองค์ประกอบในไฟล์ XML schema สำหรับ XML ที่มีลักษณะดังนี้ได้อย่างไร:

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

ฉันคิดไม่ออกว่าจะกำหนดองค์ประกอบที่เป็นประเภทxs:stringและมีแอตทริบิวต์อย่างไร

นี่คือสิ่งที่ฉันมีจนถึงตอนนี้:

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

คำตอบ:


172

ลอง

  <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>

ฉันได้รับข้อยกเว้นต่อไปนี้ในการลองใช้รหัสของคุณ - org.xml.sax.SAXParseException: src-fix: r ไม่สามารถเปลี่ยนชื่อ 'AttrElement' เป็นองค์ประกอบ (n) 'type definition' เหตุผลที่เป็นเช่นนั้น?
Ashwin

1
หากเป็นเช่นนั้นอาจเป็นเพราะเอกสารสคีมาของคุณมีเนมสเปซเป้าหมายและคุณจะต้องใช้ชื่อนำหน้าเพื่อชี้ไปที่ประเภท (หากคำนำหน้าtnsถูกผูกไว้กับเนมสเปซเป้าหมายของเอกสารสคีมาคุณจะใช้type="tns:AttrElement"เพื่ออ้างถึงประเภท)
CM Sperberg-McQueen

@Ashwin คุณอาจต้องอ้างอิงประเภทด้วยประเภทเนมสเปซ ( type="tns:AtrElement"หากเนมสเปซเริ่มต้นของ XSD ของคุณคือ xs ไม่ใช่ targetNamespace ของเอกสารโดยปกติในกรณีtnsนั้นจะถูกกำหนดและใช้
เช่น

78

... หรือเทียบเท่าแบบอินไลน์:

<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>

12
ฉันคิดว่ามันไม่ง่ายเลยที่จะกำหนดsimpleContentภายในไฟล์complexType. แต่แล้วก็เป็น XSD อีกครั้งซึ่งดูเหมือนไม่มีอะไรใช้งานง่าย ยังไงก็ขอบคุณ! :-)
ไข้หวัด

สิ่งนี้จะแสดงข้อผิดพลาดสำหรับฉันในIntelliJ ( V12.1.3 ): แอตทริบิวต์ค่าคือ "ไม่อนุญาต" ใช้complexContentแทนsimpleContentคงมัน
aZen

@CrBruno ดีกว่าเปิดคำถาม SO เฉพาะสำหรับเรื่องนี้ อย่าลังเลที่จะเชื่อมโยงไปที่นี่ในความคิดเห็น (และชี้ไปที่ duscussion นี้)
เช่น

-1

ฉันรู้ว่ามันไม่เหมือนกัน แต่มันใช้ได้กับฉัน:

<xsd:element name="option">
    <xsd:complexType mixed="true">
        <xsd:attribute name="value" use="optional" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.