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

153

我在搜索时遇到了困难。如何定义一个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>
3个回答

186

尝试

  <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”解析为“类型定义”组件。为什么会这样? - Ashwin
1
如果是这样,那很可能是因为您的模式文档具有目标命名空间,您需要使用带前缀的名称来指向该类型。(如果前缀“tns”绑定到模式文档的目标命名空间,则将使用“type =”tns:AttrElement“”来引用该类型。) - C. M. Sperberg-McQueen
@Ashwin,你可能需要使用类型名称空间来引用类型(如果 XSD 的默认命名空间不是文档的目标命名空间,则为 type="tns:AtrElement")。通常在这种情况下,tns 被定义并使用。 - eckes

85

...或者其内联等效形式:

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

16
我发现在complexType内定义simpleContent很不直观。但再说,这是XSD,在那里似乎没有什么真正直觉的东西。还是谢谢! :-) - flu
这在我的 IntelliJ (V12.1.3) 中会显示一个错误:value 属性是“不允许的”。使用 complexContent 而不是 simpleContent 可以解决这个问题。 - aZen

-1

我知道这不是完全一样的,但对我来说它有效:

<xsd:element name="option">
    <xsd:complexType mixed="true">
        <xsd:attribute name="value" use="optional" type="xsd:string"/>
    </xsd:complexType>
</xsd:element>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接