在 unknown/ignored 标签内或多个层次结构下验证标签?
Validate tag inside unknown/ignored tag or under multiple hierarchies?
我有一个包含多个未知标签的 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>
我的问题是 template 和 child 等已知标签出现在未知标签内,以及已知标签和未知标签的未知层次结构下。
有没有办法 xs:any
可以包含已知标签或添加对已知标签的验证并忽略层次结构,以便在任何层次结构下检查已知标签内的错误?
欢迎使用 XSD 1.1 或 XSD 1.0 中的任何解决方案。
您的 "unknown tag" 可能是允许的,因为它的父元素通过通配符 (xs:any) 允许任意内容。
当您指定 <xs:any processContents="lax"/>
时,将验证其名称对应于架构中全局元素声明名称的未知元素的所有子元素;结果是已知元素被验证而未知元素未被验证。
只要您能预料到允许的元素集,xs:any/@processContents="lax"
将允许您限制其内容模型。
或者,您可以通过指定 @processContents="skip"
让 xsd:any
允许未知标签,但是一旦这样做,您将失去对这些元素指定进一步约束的所有能力, 除了通过 xs:assert
.
如果您可以根据 xs:assert
XPath 制定约束条件,就可以了。但是,您不能像您希望的那样,将 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。
我有一个包含多个未知标签的 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>
我的问题是 template 和 child 等已知标签出现在未知标签内,以及已知标签和未知标签的未知层次结构下。
有没有办法 xs:any
可以包含已知标签或添加对已知标签的验证并忽略层次结构,以便在任何层次结构下检查已知标签内的错误?
欢迎使用 XSD 1.1 或 XSD 1.0 中的任何解决方案。
您的 "unknown tag" 可能是允许的,因为它的父元素通过通配符 (xs:any) 允许任意内容。
当您指定 <xs:any processContents="lax"/>
时,将验证其名称对应于架构中全局元素声明名称的未知元素的所有子元素;结果是已知元素被验证而未知元素未被验证。
只要您能预料到允许的元素集,xs:any/@processContents="lax"
将允许您限制其内容模型。
或者,您可以通过指定 @processContents="skip"
让 xsd:any
允许未知标签,但是一旦这样做,您将失去对这些元素指定进一步约束的所有能力, 除了通过 xs:assert
.
如果您可以根据 xs:assert
XPath 制定约束条件,就可以了。但是,您不能像您希望的那样,将 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。