验证未知/忽略标记内或多个层次结构中的标记?

时间:2016-07-10 17:28:19

标签: xml xsd xerces xsd-1.1 xsd-1.0

我有一个包含多个未知标记的XML文件,其中包含应添加验证的已知标记。

<root>
  <child>
    <template id="abc"/>
  </child>
  <child>
    <random>
      <template id="abc"/>
    </random>
  </child>
</root>

随机标记表示由xs:any表示的未知随机标记,我移至XSD 1.1以允许:

<xs:choice>
   <xs:element name="child" type="xs:string">
        <xs:complexType>
           <xs:sequence>
              <xs:element name="template" type="xs:string">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="id" use="optional">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:pattern value="[a-z]"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:attribute>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
              </xs:element>
              <xs:any/>
           </xs:sequence>
       </xs:complexType>    
   </xs:element>
  <xs:any/>
</xs:choice>

我的问题是模板和儿童等已知标签出现在未知标签内,并且在已知和未知标签的未知层次结构下。

xs:any是否可以包含已知标记或添加已知标记的验证并忽略层次结构,因此在任何层次结构下都会检查已知标记内的错误?

欢迎使用XSD 1.1或XSD 1.0中的任何解决方案。

2 个答案:

答案 0 :(得分:1)

您的&#34;未知标签&#34;大概是允许的,因为它的父元素通过通配符(xs:any)允许任意内容。

当您指定<xs:any processContents="lax"/>时,将验证其名称对应于架构中全局元素声明名称的未知元素的所有子元素;效果是已知元素已经过验证,未知元素不是。

答案 1 :(得分:1)

只要您可以预测允许的元素集,xs:any/@processContents="lax"就可以限制其内容模型。

或者,您可以通过指定xsd:any@processContents="skip"允许未知标记,但是一旦您这样做,您将失去指定对这些元素的进一步约束的所有能力,除了通过{{1 }}

如果您可以根据xs:assert XPath制定约束,那么您就可以了。但是,你不能,因为它听起来像你希望能够做的那样,对于跳过的元素的后代,有xs:assert后跟xs:any/@processContents="skip"xs:any/@processContents="lax"的混合。 (如果从xs:any/@processContents="strict"开始,当然可以在层次结构中更深入地使用@processContents="lax",但不是相反。)

另请参阅: processContents strict vs lax vs skip for xsd:any