代码之家  ›  专栏  ›  技术社区  ›  Dave

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

  •  5
  • Dave  · 技术社区  · 8 年前

    我正在为一个没有内容、只有属性的元素编写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,但我无法解决如何允许内容,只能允许空白内容。 有什么建议吗?

    2 回复  |  直到 7 年前
        1
  •  4
  •   kjhughes    7 年前

    您可以使用 xsd:whiteSpace 具有的方面 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"

        2
  •  2
  •   unilynx    7 年前

    我们发现嵌套两个空的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测试)