我使用以下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个空格被折叠为一个或零个空格?在XmlSpy中,验证失败,在.Net中它成功。
答案 0 :(得分:6)
由于它表示删除了前导和尾随空格,这意味着只包含空格的字符串将折叠为空字符串。 XmlSpy在验证中是准确的,而.NET是慷慨的(或者是出错)。
这是根据White Space Normalization during Validation的XML Schema Part 1: Structures Second Edition提供的。
<强>保留强>
没有进行归一化,值是·归一化值·
的替换强>
所有出现的#x9(tab),#xA(换行)和#xD(回车)都被替换了&gt; #x20(空格)。
的崩溃强>
在替换之后指定的替换之后,连续的序列 将#x20s折叠为单个#x20,删除初始和/或最终#x20s。
因此,首先将所有空格替换为空白字符,将第二个连续序列替换为单个空白字符,第三个和最后一个,删除初始和最终空白。在此序列之后,在验证期间必须将仅包含空格的字符串规范化为空字符串。
答案 1 :(得分: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>