XML模式允许嵌套标签的任何组合,但没有混合标签+ [未标记]文本?

时间:2016-12-06 17:52:49

标签: xml xsd

是否有简单的XML架构(XSD)允许嵌套标签的任意组合(即字面上的任何元素名称),但没有混合标签+ [未标记]文本?

所以这将是无效的:

<?xml version="1.0" encoding="UTF-8"?> <root>Some text <tag1>Other text</tag1></root>

但这没关系:

<root><tag2>Some text</tag2> <tag1>Other text</tag1> <tag1>Third text<tag2>Last text</tag2></tag1></root>

重申:所有内容必须位于匹配的标记对之间。

1 个答案:

答案 0 :(得分:1)

是的,xs:any将允许root下面的任何元素,并且不允许混合内容:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:any namespace="##any" processContents="lax"
                minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

如果您还想允许混合内容,则可以将mixed="true"添加到xs:complexType

另见processContents strict vs lax vs skip for xsd:any

更新以发表评论:

  

直接在那些人的子节点怎么样?和所有   树下还有孩子吗?默认为mixed =&#34; false&#34;适用   那些呢?

不,上述XSD不会阻止root的儿童混合内容。

为了防止树中更深层次的混合内容,您可以使用`processContents =&#34; strict&#34;并排除允许元素中的混合内容。如果限制太多,在XSD 1.1中你可以使用断言:

XSD 1.1

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:any namespace="##any" processContents="lax"
                minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      <xs:assert test="every $e in .//* 
                       satisfies not($e/* and $e/text()[normalize-space()])"/>
    </xs:complexType>
  </xs:element>
</xs:schema>