XML模式:具有仅包含文本的属性的元素吗?


133

我很难找到这个。我如何在XML模式文件中为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>

Answers:


168

尝试

  <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-resolve:无法将名称'AttrElement'解析为一个(n)'类型定义'组件。为什么呢?
阿什温

1
如果是这样,则可能是因为您的模式文档具有目标名称空间,并且您将需要使用前缀名称来指向类型。(如果前缀tns绑定到架构文档的目标名称空间,则将type="tns:AttrElement"用来引用该类型。)
CM Sperberg-McQueen 2013年

@Ashwin,您可能需要使用类型名称空间引用类型(type="tns:AtrElement"如果XSD的默认名称空间是xs而不是文档的targetNamespace。通常在这种情况下tns已定义和使用。)
eckes

75

...或内联等效项:

<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
我真的感到很直观的定义simpleContentcomplexType。但是还是XSD,似乎没有什么真正直观的。尽管如此,谢谢!:-)
流感

这将在IntelliJV12.1.3)中为我显示一个错误:value属性为“不允许”。使用complexContent而不是simpleContent对其进行了修复。
2013年

@CrBruno最好为此打开一个专用的SO问题。随时在评论中链接至此(并指出此争议)
eckes

-2

我知道这并不相同,但是对我有用:

<xsd:element name="option">
    <xsd:complexType mixed="true">
        <xsd:attribute name="value" use="optional" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.