XML Schema:如何允许具有属性但没有文本的元素?

时间:2015-02-11 19:02:56

标签: xml xsd xsd-validation

我正在尝试创建一个用于验证XML文件的XSD,并且有几个元素需要具有属性但没有文本。

E.g。这应被视为有效:

<DEPRECATED value="blah"/>

这些无效:

<DEPRECATED>blah</DEPRECATED>
<DEPRECATED value="blah">bad text</DEPRECATED>

我尝试声明一个复杂的空元素,如here所述,但我要么错误地解释了示例,要么示例本身是错误的(请参阅下面的错误):

<xs:element name="DEPRECATED" type="stringValue" minOccurs="0" maxOccurs="1"/>

<xs:complexType name="stringValue">
        <xs:complexContent>
            <xs:restriction base="xs:integer">
                <xs:attribute name="value" type="xs:string"/>
            </xs:restriction>
        </xs:complexContent>
</xs:complexType>

错误:类型'stringValue'的复杂类型定义表示错误。使用时,基类型必须是complexType。 'integer'是一个simpleType。

我也尝试过这样定义complexType:

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

但是,这认为上面的无效示例是有效的。 [编辑:更正,以上 工作。]

我也玩过类似问题的答案(Define an XML element that must be empty and has no attributesPrevent Empty Elements in XML via XSD),但没有运气。

如何验证元素是否具有属性,但是没有文本?

3 个答案:

答案 0 :(得分:1)

此XML有效

<DEPRECATED value="blah"/>

和此XML

<DEPRECATED>blah</DEPRECATED>

和此XML

<DEPRECATED value="blah">bad text</DEPRECATED>
使用此XSD

无效:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="DEPRECATED">
    <xs:complexType>
      <xs:attribute name="value"/>
    </xs:complexType>
  </xs:element>

</xs:schema>

答案 1 :(得分:0)

我认为你是在追求这样的事情

<xs:schema elementFormDefault="qualified" version="1.0"
    targetNamespace="stackoverflow" xmlns:tns="stackoverflow"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="Test">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="DEPRECATED" type="tns:deprecatedType" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="deprecatedType">
        <xs:attribute name="number" />
    </xs:complexType>
</xs:schema>

此XML文档有效

<sf:Test xmlns:sf="stackoverflow"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="stackoverflow test.xsd">
    <sf:DEPRECATED number="123"/>
</sf:Test>

此XML文档无效

<sf:Test xmlns:sf="stackoverflow"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="stackoverflow test.xsd">
    <sf:DEPRECATED number="123">TEST</sf:DEPRECATED>
</sf:Test>

如果要限制属性,可能需要以下内容:

<xs:complexType name="deprecatedType">
    <xs:attribute name="number">
        <xs:simpleType>
            <xs:restriction base="xs:string" />
        </xs:simpleType>
    </xs:attribute>
</xs:complexType>

答案 2 :(得分:0)

试试这个:

  <xsd:simpleType name="EmptyType">
    <xsd:restriction base="xsd:string">
      <xsd:length value="0" />
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:complexType name="DeprecatedType">
    <xsd:simpleContent>
      <xsd:extension base="EmptyType">
        <xsd:attribute name="value" type="xsd:string" />
      </xsd:extension>
    </xsd:simpleContent>
  </xsd:complexType>