-1

我对 xsd 知之甚少,急需解决一个小问题。我需要定义一个元素(命名标签),它可以具有任何类型和数量的子元素(以及文本),但不能包含空字符串。示例:<tag1> co<sub1>2</sub1> <b1>laser</b1></tag1>,<tag1>co2</tag1>,<tag1><i1>laser</i1></tag1 > 是允许的(假设甚至 <tag1><i1></i1></tag1> 也是允许的)。但 <tag1></tag1> 不允许。请让我知道是否有一种非常简单的方法可以做到这一点。

4

1 回答 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 回答