2015-08-04 2 views
1

Я пытаюсь написать правило Schematron выполнить следующий тест ...Эксклюзивный тест XPath

Если нет литий под корень не содержит «ABC» и корень содержит название, «DEF» доложите.

Проблема, с которой я столкнулась, заключается в том, что я получаю много ложных срабатываний. Вот мой текущий XPath ...

<rule context="li"> 
       <assert test="not(contains(text(),'abc')) and ancestor::root/descendant::title = 'def'">Report this.</assert> 
      </rule> 

Мой выход заканчивает отчетности по каждой литий, который не содержит «ABC», который я понимаю, так как он проверяет каждый Ли и отчетности.

Однако я не знаю, как написать XPath, чтобы я мог проверить, содержит ли какой-либо li «abc».

Спасибо!

+0

Можете ли вы показать образец XML, который дает ложное срабатывание? – LarsH

ответ

3

Проблема, как вы намекали, заключается в том, что вы выразили это в Schematron, как правило, применительно к каждому элементу li; тогда как правило, описанное на английском языке, относится к каждому элементу root.

Таким образом, вы могли бы выразить это как

<rule context="root"> 
    <assert test=".//li[contains(text(),'abc')] or 
       not(.//title = 'def')">Report this.</assert> 
</rule> 

Обратите внимание, что я перевернул смысл теста, чтобы соответствовать вашему Английскому Описанию

Если нет литий под корнем не содержат «а» и root содержит заголовок, «def», затем отчет.

Поскольку вы используете элемент <assert>, вы утверждаете противоположность тому, что хотите сообщить. Возможно, имеет смысл использовать элемент <report>:

<rule context="root"> 
    <report test="not(.//li[contains(text(),'abc')]) and 
       .//title = 'def'">Report this.</report> 
</rule> 
+1

Спасибо! Это именно то, что мне нужно. Я понял, что у меня была какая-то логика. Правильный ответ! – Jeff

+0

@Jeff Рад помочь. Скамтринные камни! – LarsH