需要任何元素序列中的特定元素

时间:2015-08-19 08:23:27

标签: xml xsd xsd-validation

我想像这样创建一个XSD:

<xs:schema>
  <xs:element name="a">
    <xs:complexType>
      <xs:sequence>
        <xs:any minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="b" minOccurs="1" maxOccurs="unbounded"/>
        <xs:any minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

阐释:

元素内的元素:

  • 任何元素0到无穷大时间。
  • 元素b 1到无穷大时间。
  • 任何元素0到无穷大时间。

我尝试使用choiceall等,但我找不到任何解决方案。

来自XmlSpy的错误:

  

<any...>使内容模型对<xs:element name="b" ...>不确定。可能的原因:名称相等,重叠发生   或替代组。

1 个答案:

答案 0 :(得分:2)

只要至少有一个a元素,您的XSD就会有效地说b可以包含任何子元素序列。

XSD 1.0无法强制执行此类约束,因为任何尝试这样做的操作(包括您提供的操作)都会违反唯一粒子原则。

XSD 1.1可以通过一个简单的断言强制执行这样的约束,声明b xsd:anya个孩子之间存在<?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="a"> <xs:complexType> <xs:sequence> <xs:any processContents="skip" maxOccurs="unbounded"/> </xs:sequence> <xs:assert test="b"/> </xs:complexType> </xs:element> </xs:schema>

XSD 1.1

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    rootView = inflater.inflate(R.layout.fragment_layout, container, false);

    getChildFragmentManager().beginTransaction().add(R.id.fragment_container, MyFragment.getInstance() ).commit();

    return rootView;
}