我对 xsd 知之甚少,急需解决一个小问题。我需要定义一个元素(命名标签),它可以具有任何类型和数量的子元素(以及文本),但不能包含空字符串。示例:<tag1> co<sub1>2</sub1> <b1>laser</b1></tag1>,<tag1>co2</tag1>,<tag1><i1>laser</i1></tag1 > 是允许的(假设甚至 <tag1><i1></i1></tag1> 也是允许的)。但 <tag1></tag1> 不允许。请让我知道是否有一种非常简单的方法可以做到这一点。
问问题
469 次
1 回答
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) 使用混合内容约束复杂类型的文本内容。
祝你好运。
于 2013-10-02T19:06:52.027 回答