我从XML Schema specification of whitespace了解到:
对于所有数据类型·派生·通过·union·whiteSpace不直接应用;但是,union·types的规范化行为由whiteSpace的值控制在·memberTypes·中的一个·unionTypes·成功验证了?union。
和
表示字符串,whiteSpace的值为
我正在尝试将XSD添加到现有的XML系统中。我有时需要匹配现有的杂乱字符串。例如,假设我需要匹配:
<?xml version="1.0" encoding="UTF-8" ?>
<root1 stuff="Hello World	!" />
使用这个(下面)XSD一切都很好,因为“对于xs:string,保留了空格的值”。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="Hello">
<xs:restriction base="xs:string">
<xs:pattern value="Hello World	!"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="root1">
<xs:complexType>
<xs:attribute name="stuff" type="Hello" />
</xs:complexType>
</xs:element>
</xs:schema>
当我需要将“stuff”的合法值扩展到与其他简单类型联合时,问题就开始了。我发现这个问题并不关心我与之结合,或者我与任何东西结合在一起。因此,最简单的演示是将这些定义添加到上面的XSD中。
<xs:simpleType name="HellUnion">
<xs:union memberTypes="Hello" />
</xs:simpleType>
<xs:element name="root2">
<xs:complexType>
<xs:attribute name="stuff" type="HellUnion" />
</xs:complexType>
</xs:element>
然后Xerces-C拒绝此XML为无效:
<?xml version="1.0" encoding="UTF-8" ?>
<root2 stuff="Hello World	!" />
我认为错误信息很有启发性:
价值'Hello World!'与联合的任何成员类型都不匹配
注意'!'之前的空格选项卡之前的位置。
Microsoft .Net运行时XML / XSD系统将其报告为有效。
我尝试将whitespace = preserve添加到“Hello”简单类型定义中:
<xs:simpleType name="Hello">
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
<xs:pattern value="Hello World	!"/>
</xs:restriction>
</xs:simpleType>
这没有帮助。
以上是尝试简单地演示问题,但真正的问题来自允许空格的正则表达式的联合。在这种情况下,文档被发现是有效的,但返回给应用程序的值在验证时是“空白空间折叠”,在未验证时是未折叠的。
将产品从未经验证的XML移动到经过验证的XML时,这是一个问题。这些值需要在程序中的其他地方(不是XML)中精确匹配字符串值。
也许有人可以告诉我在简单类型上设置“空白区域”的更好方法吗?