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

XML模式:如何允许元素具有属性但没有文本?,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,我试图创建一个XSD来验证XML文件,有几个元素需要有属性,但没有文本 例如,这应被视为有效: <DEPRECATED value="blah"/> 这些是无效的: <DEPRECATED>blah</DEPRECATED> <DEPRECATED value="blah">bad text</DEPRECATED> 废话 错误文本 我尝试按照前面所述声明一个复杂的空元素,但不是我对示例的解释不正确,就是示例本身错误(请参见下

我试图创建一个XSD来验证XML文件,有几个元素需要有属性,但没有文本

例如,这应被视为有效:

<DEPRECATED value="blah"/>

这些是无效的:

<DEPRECATED>blah</DEPRECATED>
<DEPRECATED value="blah">bad text</DEPRECATED>
废话
错误文本
我尝试按照前面所述声明一个复杂的空元素,但不是我对示例的解释不正确,就是示例本身错误(请参见下面的错误):


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

我还尝试通过以下方式定义complexType:

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

但这认为上面的无效示例是有效的。[编辑:更正,以上内容确实有效。]

我也尝试过类似问题的答案(,),但运气不好


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

此XML将是有效的

<DEPRECATED value="blah"/>

和此XML

<DEPRECATED>blah</DEPRECATED>
<DEPRECATED value="blah">bad text</DEPRECATED>
废话
和此XML

<DEPRECATED>blah</DEPRECATED>
<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>

我想你想要的是这样的东西

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

试试这个:

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


对不起。我无意冒犯你。原来的问题似乎是想给属性添加一个限制,所以试图展示如何做到这一点,并把整个事情放在完整的上下文中。看起来原来的评论被删除了。希望答案有帮助SBTW:我使用嵌套的complexTypes进行了测试,并使其正常工作。你是如何测试验证的?你是对的,它确实有效。我的文件中不推荐使用的元素(我认为该元素无效)是另一个元素的子元素,而不是“property”元素#facepalm和我在删除之前看到了你提到的评论。不是我的:)。干杯。奇怪-当我尝试这个时,它仍然认为坏文本是有效的(我没有尝试另一个无效案例)。不推荐使用的元素本身在属于另一个复杂类型的序列中是否重要?将为原始问题添加细节…不,这不重要。如果您仍然有问题,请提供确切的XSD和XML以及错误消息,因为在序列中,或者被匿名或显式定义应该无关紧要。谢谢,谢谢。我发现了问题-我的文件中不推荐使用的元素(我认为无效的元素)是另一个元素的子元素,而不是“property”元素。Argh-答案在问题中。上面定义的complexType不起作用,我的XML文件有问题。