Проверяйте один узел на основе критериев другого узла, ссылаясь на @ID критерия.

Я пытаюсь проверить наличие дочернего элемента на основе критериев в другом элементе документа, идентифицированном его идентификатором. Использование ISO Schematron и XPath 2.0.

Возьмем следующий пример:

<value id="red" bits="16" />

<foo value_id="red">
    <increased_sensitivity/>
</foo>

Элемент "increased_sensitivity" должен быть разрешен только в том случае, если элемент "value" с @id "red" содержит атрибут bits="16" где-то в документе.

Честно говоря, я даже не уверен, что это возможно с Schematron, мой опыт работы с ним довольно ограничен.


person XedMada    schedule 31.05.2011    source источник


Ответы (1)


Предполагая, что вы хотите найти элемент значения, идентификатор которого соответствует значению идентификатора foo (в данном случае «красный»), а затем проверить там значение битов, тогда эта схема Schematron показывает один из способов, которым это можно сделать:


<?xml version="1.0"?>    
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron">

  <sch:let name="root" value="/"/>

  <sch:pattern>
    <sch:rule context="increased_sensitivity">
      <sch:let name="id" value="parent::*/@value_id"/>
      <sch:let name="assoc-bits-value" value="$root//value[@id=$id]/@bits"/>
      <sch:assert test="$assoc-bits-value = 16">When the increased_sensitivity element is used, a
        corresponding value element must exist in the doucment with a bits value of
        "16".</sch:assert>
    </sch:rule>
  </sch:pattern>

</sch:schema>

person alexbrn    schedule 31.05.2011
comment
Спасибо за быстрый ответ! К сожалению, теперь я понимаю, что не совсем ясно выразился в своем вопросе. Правило схемы должно соответствовать любому указанному значению value_id для вхождения элемента foo, а не конкретно красному идентификатору. @value_id указан в схеме xsd:IDREF и, таким образом, может быть любым идентификатором, определенным в другом месте документа. - person XedMada; 01.06.2011
comment
Я понял, что вы, вероятно, имели в виду, когда я перечитал его - теперь ответ делает то, что вы хотите, я думаю! :-) - person alexbrn; 01.06.2011
comment
Ах да, это не только работает, но и раскрывает гораздо лучшую технику, которую я могу использовать, чтобы выяснить пару других проблем, с которыми я застрял. Большое спасибо. - person XedMada; 01.06.2011