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



我有一个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 中的任何解决方案。

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

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

如果你能根据xs:assert XPaths来设计你的约束,你会没事的。 但是,您不能像听起来希望能够做到的那样,为跳过的元素的后代混合xs:any/@processContents="skip"后跟xs:any/@processContents="lax"xs:any/@processContents="strict"。 (如果从 @processContents="lax" 开始,当然,您始终可以在层次结构中更深入地使用xs:any/@processContents="skip",但不能相反。

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

您的"未知标记"可能是允许的,因为它的父元素通过通配符 (xs:any) 允许任意内容。

指定 <xs:any processContents="lax"/> 时,将验证名称与架构中全局元素声明的名称相对应的任何未知元素的子元素;其效果是验证已知元素,而未知元素不验证。

最新更新