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

У меня есть файл 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 приветствуется.


person josephino    schedule 10.07.2016    source источник


Ответы (2)


Пока вы можете предвидеть набор разрешенных элементов, xs:any/@processContents="lax" позволит вам ограничивать их модели содержимого.

Кроме того, вы можете xsd:any разрешить неизвестные теги, указав @processContents="skip", но как только вы это сделаете, вы потеряете всякую возможность указывать дополнительные ограничения для этих элементов, кроме как через 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.

person kjhughes    schedule 10.07.2016
comment
Как я могу создать ограничения с точки зрения xs:assert Xpath Если Xpath неизвестен, Xpath представляет собой смесь известных и неизвестных тегов. - person josephino; 11.07.2016
comment
Это зависит от того, какие ограничения вы хотите выразить. Вам не обязательно знать имена элементов, чтобы писать ограничения; * может соответствовать любому дочернему элементу: every..satisfies может делать утверждения о наборах безымянных элементов; и т. д. Вы не сможете использовать внутренние конструкции моделирования содержимого XSD, но вы можете охватить многое с помощью xs:assert. Однако на самом деле, за исключением утверждений типа выборочной проверки, придерживайтесь lax настолько, насколько вы можете его использовать. - person kjhughes; 11.07.2016
comment
на случай, если у меня есть что-то подобное: <root> <child> <template/> </child> <child> <random><template/></random> </child> </root> , как применить ограничение регулярного выражения к атрибуту тега шаблона? - person josephino; 13.07.2016
comment
Возможно, на этом этапе лучше задать новый вопрос. Если вы это сделаете, обязательно укажите условия, при которых template должен иметь атрибут, соответствующий регулярному выражению. Например, все templates? Все templates потомки child? Только templates являются внуками child? И т. д. - person kjhughes; 13.07.2016
comment
Я добавил новый вопрос, как было предложено: stackoverflow.com/questions/38340411/ - person josephino; 13.07.2016

Ваш «неизвестный тег» предположительно разрешен, потому что его родительский элемент допускает произвольное содержимое благодаря подстановочному знаку (xs:any).

Когда вы указываете <xs:any processContents="lax"/>, все дочерние элементы неизвестного элемента, имя которых соответствует имени объявления глобального элемента в схеме, будут проверены; эффект заключается в том, что известные элементы проверяются, а неизвестные — нет.

person Michael Kay    schedule 10.07.2016