具有除空字符串之外的任何类型的子元素的元素

时间:2013-10-02 06:23:16

标签: xsd-validation

我对xsd知之甚少,迫切需要解决一个小问题。 我需要定义一个元素(命名标记),它可以包含任何类型和数量的子元素(以及文本),但不能包含空字符串。 示例:< tag1>共< SUB1→2< / SUB1> < B1>激光< / B1>< / TAG1>,< TAG1> CO 2< / TAG1>,< TAG1>< I1>激光< / I1>< / TAG1>是允许的(假设即使< tag1>< i1>< / i1>< / tag1>也是允许的)。但是< tag1>< / tag1>不允许。如果有一种非常简单的方法,请告诉我。

1 个答案:

答案 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)约束具有混合内容的复杂类型的文本内容。

祝你好运。