2010-12-10 78 views
20

这是我的示例XML代码:对于Xml,XSD元素不为空或空约束?

<bestContact> 
<firstName><![CDATA[12345]]></firstName> 
<lastName /> 
</bestContact> 

我使用:

<xs:element name="lastName" type="xs:string" minOccurs="1" nillable="false"/> 

的XSD应验证lastName不为空。

回答

42

尝试

<xs:element name="lastName" minOccurs="1" nillable="false"> 
    <xs:simpleType> 
    <xs:restriction base="xs:string"> 
     <xs:minLength value="1"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:element> 
+3

很好的答案 - 'nillable'是多余的想法。 – 2010-12-10 12:23:11

+0

@Nic - 同意。我只是从问题中复制并粘贴了这一行:) – Kamal 2010-12-10 12:32:49

+0

使用这个我得到“Element'lastName'同时具有'type'属性和'匿名类型'子元素,只有其中一个元素被允许。我认为在容器元素中使用type =“xs:string”存在问题。 – 2016-06-23 03:19:20

9

@Kamal在这里给你基本上是正确的答案。这就是为什么 - nillable总是会导致问题。实际上,您可以考虑nillable,意思是允许此元素上的xsi:nil属性。 XML Schema spec描述了带外信号 - 它基本上用于向数据库指示NULL

你想要的是通过@Kamal

13
<xsd:element name="lastName" type="NonEmptyString" nillable="false"/> 

<xsd:simpleType name="NonEmptyString"> 
    <xsd:restriction base="xs:string"> 
    <xsd:minLength value="1" /> 
    <xsd:pattern value=".*[^\s].*" /> 
    </xsd:restriction> 
</xsd:simpleType> 
+0

我喜欢这个比Gab提供的2更好,这个对我很有用。因为我一直在寻找一个表达式,刚刚摆脱了前导空格,而不是文字 – ycomp 2016-03-04 17:47:15

+2

之间的空格,我认为你可以用这个正则表达式替换''S +'正如Gab指出的那样。 – bvdb 2016-04-18 15:42:46

8

给出了必须至少有一个字符长的一个元素这是恕我直言一个更好的模式:

<xs:simpleType name="NonEmptyString"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="^(?!\s*$).+" /> 
    </xs:restriction> 
</xs:simpleType> 

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

你的第一个建议是否对第二个建议有利? – ycomp 2016-03-04 17:35:44

+0

那么一个(非空)blanck字符串将被允许第一个但不是第二个。这取决于你的需求 – Gab 2016-03-07 08:28:46

0

这是我最喜欢的解决方案。

<xs:simpleType name="NonEmptyString"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="[\s\S]*[^ ][\s\S]*"/> 
    </xs:restriction> 
</xs:simpleType>`