为什么 space 会在此处中断验证?

Why does a space break validation here?

在我的 XML 架构中,我创建了一个名为 NonEmptyString 的类型。它应该拒绝任何 null 值或仅由空格组成的值。我把它反过来说它应该接受任何至少有一个非空白字符的东西。这应该包括两个非空白字符之间带有空白的任何内容。但是,它在接受 "BATCH_ANNEAL".

时拒绝 "BATCH ANNEAL"

以防万一,我将在 Python 3 脚本中使用此架构,尽管 this XML validator 也拒绝了它。

这里是 XML 架构定义:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="NonEmptyString">
    <xs:restriction base="xs:string">
      <xs:pattern value="\S+" />
    </xs:restriction>
  </xs:simpleType>

 <xs:element name="MESSAGE">
    <xs:complexType>
      <xs:sequence>
      <xs:element type="xs:short" name="MESSAGE_NUMBER"/>
      <xs:element type="NonEmptyString" name="MESSAGE_TYPE"/>
      <xs:element type="NonEmptyString" name="PLANT_CODE"/>
      <xs:element type="NonEmptyString" name="PLANT_TEXT"/>
      <xs:element type="xs:dateTime" name="TIMESTAMP"/>
      <xs:element type="NonEmptyString" name="SIMULATION_INDEX"/>
    </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

这是我要验证的元素。

<MESSAGE>
    <MESSAGE_NUMBER>2601</MESSAGE_NUMBER>
    <MESSAGE_TYPE>MaterialData</MESSAGE_TYPE>
    <PLANT_CODE>ANBA</PLANT_CODE>
    <PLANT_TEXT>BATCH ANNEAL</PLANT_TEXT>
    <TIMESTAMP>2016-03-01T08:54:53</TIMESTAMP>
    <SIMULATION_INDEX>N</SIMULATION_INDEX>
</MESSAGE>

模式必须始终匹配整个值。 \S+ 匹配 "BATCH_ANNEAL" 但不匹配 "BATCH ANNEAL".

尝试

<xs:pattern value="\S+|\S.*\S" />

强制执行完全非空白或以非空白字符开头和结尾的值。如有必要,请使用比 . 更具体的内容。

这是@Tomalak(很好,+1)基于正则表达式的解决方案的替代方案。此方法使用 xs:minLength and xs:whiteSpace facets instead of an xs:pattern 正则表达式:

<xs:simpleType name="NonEmptyString">
   <xs:restriction base="xs:string">
    <xs:minLength value="1" />
    <xs:whiteSpace value='collapse'/>
   </xs:restriction>
</xs:simpleType>