在 XSD 中,如何在元素的内容中只允许空格?
In XSD how do I allow only whitespace in an element's content?
我正在为一个没有内容,只有属性的元素编写 XSD,这看起来相当简单:
<xs:complexType name="ViewElement">
<xs:attribute name="Name" type="xs:string" use="required"/>
</xs:complexType>
<xs:element name="VIEW" type="ViewElement" minOccurs="0" maxOccurs="unbounded"/>
如果XML包含
<VIEW Name='V_UP'></VIEW>
或
<VIEW Name='V_UP'/>
它工作正常。但是如果 XML 包含
<VIEW Name='V_UP'>
</VIEW>
我明白了
The element cannot contain white space. Content model is empty.
我想允许 XML 的作者以这种方式编写 XML 的灵活性,但我不知道如何允许内容,但只能是空白内容。
有什么建议吗?
您可以将 xsd:whiteSpace
facet 与 value="collapse"
一起使用,并要求长度为 0:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="OnlyWhiteSpaceElement">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:length value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
更新 1: OP 想将属性添加到 OnlyWhiteSpaceElement
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="OnlyWhiteSpaceElement">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="OnlyWhiteSpaceType">
<xs:attribute name="Name" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name="OnlyWhiteSpaceType">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:length value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
另请参阅:
更新 2: OP 想重用当前的匿名复杂类型。让我们定义一个命名类型并重构正在使用的名称...
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="OnlyWhiteSpaceElement" type="OnlyWhiteSpaceType"/>
<xs:complexType name="OnlyWhiteSpaceType">
<xs:simpleContent>
<xs:extension base="OnlyWhiteSpaceContentType">
<xs:attribute name="Name" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="OnlyWhiteSpaceContentType">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:length value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
更新 3: 注意 。
我们发现嵌套两个空 xs:sequences 是一个更简洁的解决方案:
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:sequence />
</xs:sequence>
<xs:attribute name="test" type="xs:string" />
</xs:complexType>
</xs:element>
(使用 libxml 测试)
我正在为一个没有内容,只有属性的元素编写 XSD,这看起来相当简单:
<xs:complexType name="ViewElement">
<xs:attribute name="Name" type="xs:string" use="required"/>
</xs:complexType>
<xs:element name="VIEW" type="ViewElement" minOccurs="0" maxOccurs="unbounded"/>
如果XML包含
<VIEW Name='V_UP'></VIEW>
或
<VIEW Name='V_UP'/>
它工作正常。但是如果 XML 包含
<VIEW Name='V_UP'>
</VIEW>
我明白了
The element cannot contain white space. Content model is empty.
我想允许 XML 的作者以这种方式编写 XML 的灵活性,但我不知道如何允许内容,但只能是空白内容。 有什么建议吗?
您可以将 xsd:whiteSpace
facet 与 value="collapse"
一起使用,并要求长度为 0:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="OnlyWhiteSpaceElement">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:length value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:schema>
更新 1: OP 想将属性添加到 OnlyWhiteSpaceElement
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="OnlyWhiteSpaceElement">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="OnlyWhiteSpaceType">
<xs:attribute name="Name" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:simpleType name="OnlyWhiteSpaceType">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:length value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
另请参阅:
更新 2: OP 想重用当前的匿名复杂类型。让我们定义一个命名类型并重构正在使用的名称...
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="OnlyWhiteSpaceElement" type="OnlyWhiteSpaceType"/>
<xs:complexType name="OnlyWhiteSpaceType">
<xs:simpleContent>
<xs:extension base="OnlyWhiteSpaceContentType">
<xs:attribute name="Name" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="OnlyWhiteSpaceContentType">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
<xs:length value="0"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
更新 3: 注意
我们发现嵌套两个空 xs:sequences 是一个更简洁的解决方案:
<xs:element name="a">
<xs:complexType>
<xs:sequence>
<xs:sequence />
</xs:sequence>
<xs:attribute name="test" type="xs:string" />
</xs:complexType>
</xs:element>
(使用 libxml 测试)