我正在尝试创建一个用于验证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 attributes,Prevent Empty Elements in XML via XSD),但没有运气。
如何验证元素是否具有属性,但是没有文本?
答案 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>