Как в правиле Schematron получить доступ к родительскому элементу текущего элемента?

Я использую ISO Schematron для проверки XML-документа. Установленное мной правило работает по мере необходимости, но я хочу сообщить имя родительского элемента из контекста, в котором срабатывает мое утверждение. Образец документа может содержать фрагмент XML:

<Name>Alan Smith<br/></Name>

Мое правило Schematron проверяет, что элемент <br/> может встречаться только как дочерний элемент элемента <title>. Правило следующее:

<rule context="br">
    <assert test="parent::title"
     >The "br" element is not allowed as a child of the '<iso:value-of select=".."/>' element.'</assert>
</rule>

Когда я запускаю это правило для фрагмента, утверждение срабатывает правильно, однако я хочу, чтобы сообщение сообщало мне, что «элемент «br» не разрешен в качестве дочернего элемента элемента «Имя». Вместо этого он на самом деле показывает, что «элемент «br» не разрешен в качестве дочернего элемента элемента« Alan Smith »». Итак, выражение <iso:value-of select=".."/> на самом деле выбирает текстовый узел, а не родительский элемент, как я ожидал? Может ли кто-нибудь помочь объяснить, какое выражение XPpath я должен использовать в операторе select для отображения имени родительского элемента в моем сообщении об ошибке? Спасибо.

ОБНОВЛЕНИЕ: мне удалось добиться желаемого результата, удалив оператор select и заменив его элементом имени, как в:

<rule context="br">
    <assert test="parent::title"
     >The "br" element is not allowed as a child of the '<name path=".."/>' element.'</assert>
</rule>

Итак, моя проблема решена, но если кто-нибудь может объяснить, почему моя первая попытка не работает, это было бы очень полезно.


person Wee Shetland    schedule 11.04.2011    source источник


Ответы (2)


Вот как работает элемент value-of. Из http://www.schematron.com/iso/P8.html#GEN16

value-of элемент

Находит или вычисляет значения из документа экземпляра, чтобы обеспечить более четкие утверждения и диагностику. Обязательный атрибут select — это выражение, оцениваемое в текущем контексте и возвращающее строку.

Ссылки на переменные в атрибуте select разрешаются в рамках текущей схемы, фазы, шаблона и правила.

Реализация, которая не сообщает об утверждениях на естественном языке, не обязана использовать этот элемент.

Вы можете получить имя родительского узла контекста с помощью этого выражения XPath.

name(..)
person Community    schedule 11.04.2011
comment
Спасибо, Алехандро, теперь это имеет смысл, подсказка находится в названии функции «value-of», она предоставляет значение узла xpath ..! - person Wee Shetland; 13.04.2011
comment
@tony_h: Добро пожаловать. Как и в XSLT, значение означает строковое значение. - person ; 13.04.2011

Я считаю, что оригинальное решение tony_h не работает из-за префикса «iso:». Поскольку остальная часть кода не использует пространство имен. Исключение этой части решит проблему.

person Pydan    schedule 25.02.2016
comment
Описание, предоставленное OP в вопросе, показывает, что <iso:value-of...> интерпретируется как элемент value-of, определенный спецификацией Schematron. Он обеспечивает именно тот результат, который должен, а это не то, чего хотел ОП. Поскольку iso:value-of делает именно то, что указывает schematron, вполне вероятно, что префикс iso сопоставляется с тем же пространством имен, что и пространство имен по умолчанию (без префикса), которое полностью допустимо в XML. Принятый ответ - это решение. Этот ответ здесь не поддерживается информацией, представленной в вопросе. - person Louis; 14.10.2016