2010-12-10 79 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>`