是否有简单的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>
重申:所有内容必须位于匹配的标记对之间。
答案 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中你可以使用断言:
<?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>