我对xsd知之甚少,迫切需要解决一个小问题。 我需要定义一个元素(命名标记),它可以包含任何类型和数量的子元素(以及文本),但不能包含空字符串。 示例:< tag1>共< SUB1→2< / SUB1> < B1>激光< / B1>< / TAG1>,< TAG1> CO 2< / TAG1>,< TAG1>< I1>激光< / I1>< / TAG1>是允许的(假设即使< tag1>< i1>< / i1>< / tag1>也是允许的)。但是< tag1>< / tag1>不允许。如果有一种非常简单的方法,请告诉我。
答案 0 :(得分:1)
如果您使用的是XSD 1.1,则可以使用断言来检查您描述的条件:
<xs:element name="tag" type="non-empty"/>
<xs:complexType name="non-empty">
<xs:sequence minOccurs="0" maxOccurs="unbounded">
<xs:any/>
</xs:sequence>
<xs:assert test="child::* or not(string(.) eq '')"/>
</xs:complexType>
在XSD 1.0中,没有这么简单的方法;如果我是你并且在XSD 1.0中工作,我会将设计更改为更容易在XSD 1.0中表达的内容。
在1.0中,很容易要求tag
元素有一个或多个子元素,而不会约束孩子:
<xs:complexType name="non-empty" mixed="true">
<xs:sequence minOccurs="1" maxOccurs="unbounded">
<xs:any/>
</xs:sequence>
</xs:complexType>
<xs:element name="tag" type="non-empty"/>
指定tag
元素可以包含任何非空字符串也很容易(我在这里接受你的话,并允许只包含空格的字符串 - 要小心你所要求的):
<xs:simpleType name="non-empty">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="tag" type="non-empty"/>
1.0中不可能的是(a)将元素声明为简单类型或复杂类型,或(b)约束具有混合内容的复杂类型的文本内容。
祝你好运。