在XSD中,如何只允许元素内容中的空格?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在XSD中,如何只允许元素内容中的空格?相关的知识,希望对你有一定的参考价值。

我正在为一个没有内容,只有属性的元素编写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>

我明白了

元素不能包含空格。内容模型为空。

我想允许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>

另见:Restrict complexType with attributes in XSD?


更新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:注意XSD processor implementation differences regarding xs:whiteSpace value="collapse"

以上是关于在XSD中,如何只允许元素内容中的空格?的主要内容,如果未能解决你的问题,请参考以下文章

XSD:允许来自不同命名空间的元素在序列中的任何位置

扩展 XSD 模式以允许一种 XSD 标准元素类型中的新属性

限制 XSD 中的字符串,使它们没有前导或尾随空格,并且只包含字母数字、连字符和下划线?

有没有办法处理 JAXB 中多个 .xsd 文件中的重复元素定义?

如何定义XSD并在XML中使用XSD

允许XSD架构中元素的随机顺序