1

我有一个包含多个未知标签的 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 中的任何解决方案。

4

2 回答 2

1

只要你能预见到允许元素的集合,xs:any/@processContents="lax"就会允许你约束它们的内容模型。

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

如果您可以根据xs:assertXPaths 制作您的约束,那么您会很好。但是,您不能像您希望的那样,混合使用被跳过的元素的xs:any/@processContents="skip"后继xs:any/@processContents="lax"xs:any/@processContents="strict"后代。(当然,如果您从 开始@processContents="lax",您总是可以xs:any/@processContents="skip"在层次结构中使用更深的,但反之则不行。)

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

于 2016-07-10T22:09:01.887 回答
1

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

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

于 2016-07-10T21:37:40.963 回答