Проверить тег внутри неизвестного / игнорируемого тега или в нескольких иерархиях?
У меня есть 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 приветствуется.
2 ответа
Пока вы можете предвидеть набор разрешенных элементов, xs:any/@processContents="lax"
позволит вам ограничить свои модели контента.
Кроме того, вы можете иметь xsd:any
разрешить неизвестные теги, указав @processContents="skip"
, но как только вы это сделаете, вы потеряете все возможности указывать дополнительные ограничения для этих элементов, кроме как через xs:assert
,
Если вы можете выработать свои ограничения с точки зрения xs:assert
XPaths, все будет хорошо. Тем не менее, вы не можете, как кажется, вы надеетесь сделать это, иметь гибрид xs:any/@processContents="skip"
с последующим xs:any/@processContents="lax"
или же xs:any/@processContents="strict"
для потомков пропущенного элемента. (Если вы начнете с @processContents="lax"
, вы всегда можете использовать xs:any/@processContents="skip"
глубже в иерархии, конечно, но не наоборот.)
См. Также: processContents строгое против слабого и пропускаемого для xsd: any.
Ваш "неизвестный тег", по-видимому, разрешен, поскольку его родительский элемент допускает произвольное содержимое с помощью подстановочного знака (xs:any).
Когда вы указываете <xs:any processContents="lax"/>
любые дочерние элементы неизвестного элемента, чье имя соответствует имени объявления глобального элемента в схеме, будут проверены; В результате известные элементы проверяются, а неизвестные - нет.