Проверить тег внутри неизвестного / игнорируемого тега или в нескольких иерархиях?

У меня есть 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"/>любые дочерние элементы неизвестного элемента, чье имя соответствует имени объявления глобального элемента в схеме, будут проверены; В результате известные элементы проверяются, а неизвестные - нет.

Другие вопросы по тегам