6

我使用以下 XmlSchema:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://www.test.com/XmlValidation"
  elementFormDefault="qualified"
  attributeFormDefault="unqualified"
  xmlns:m="http://www.test.com/XmlValidation">

  <xs:element name="test">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="testElement" type="m:requiredStringType"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

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

它定义了一个必须至少有一个字符长的 requiredStringType 并且还定义了空格折叠。

当我验证以下 Xml 文档时,验证成功:

<?xml version="1.0" encoding="UTF-8"?>
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.text.com/XmlValidation">
    <testElement>     </testElement>
</test>

w3.org 定义了空格折叠:

“在替换隐含的处理之后,#x20 的连续序列被折叠为单个 #x20,并且前导和尾随 #x20 被删除。”

这是否意味着 3 个空格被折叠为 1 个或 0 个空格?在 XmlSpy 中验证失败,在 .Net 中验证成功。

4

2 回答 2

7

由于它表示删除了前导和尾随空格,这意味着仅包含空格的字符串将被折叠为空字符串。XmlSpy 在验证中是准确的,而 .NET 是慷慨的(或正在出错)。

这是根据XML Schema Part 1: Structures Second Edition的验证期间的空白规范化

保留
没有进行规范化,该值是·规范化的值·
replace
所有出现的#x9(制表符)、#xA(换行)和#xD(回车)都被替换为#x20(空格)。
折叠
在上面在替换下指定的替换之后,#x20s 的连续序列被折叠为单个 #x20,并且初始和/或最终 #x20s 被删除。

因此,首先所有空格都被空白字符替换,第二个连续序列被单个空白字符替换,第三个和最后一个,初始和最后一个空格被删除。按照此顺序,在验证期间必须将仅包含空格的字符串规范化为空字符串。

于 2009-03-20T14:20:41.547 回答
0

这似乎适用于.Net(注意模式方面),撒克逊人不需要模式。

<xs:element name="StoreCode" minOccurs="1">
<xs:simpleType>                         
    <xs:restriction base="xs:string">
            <xs:whiteSpace value="collapse"/>
        <xs:pattern value=""/>
        <xs:minLength value="1"/>
        <xs:maxLength value="15"/>
    </xs:restriction>
</xs:simpleType>
</xs:element>
于 2014-12-17T16:46:07.807 回答