2013-12-16 1 views
0

Я пытаюсь написать чек в Schematron, который не гарантирует, что элементы не содержат дублированных данных атрибута. Эти элементы находятся в определенном месте в документе XML, у меня есть XPATH, который их находит.Проверка дублированных данных атрибутов в элементах-близнецах - Schematron

Например:

должен не потому, что он имеет дублирующие Foo и атрибуты бара значений.

<id foo="test1" bar="abc" /> 
<id foo="test1" bar="abc" /> 

Это должно пройти, поскольку атрибуты foo не совпадают.

<id foo="test1" bar="abc" /> 
<id foo="test2" bar="abc" /> 

Я не уверен, что это слишком сложно для Schematron.

Любые мысли?

ответ

0

Я не знаю Schematron, но если вы можете использовать XPath 2.0 (что возможно at least with some implementations), то deep-equal($val1, $val2) пригодится.

not(deep-equal(<id foo="test1" bar="abc" />, <id foo="test1" bar="abc" />)) (: false :) 
not(deep-equal(<id foo="test1" bar="abc" />, <id foo="test2" bar="abc" />)) (: true :) 

Если нет, то должно быть решение с использованием XSLT 1.0, но вам придется строить рекуррентные сравнения самостоятельно (и я не знаю, XSLT достаточно хорошо, чтобы сделать это).

0

Я хотел бы сделать это таким образом, в Schematron (проверено с XML ValidatorBuddy):

<iso:pattern id="unique name attributes"> 
    <iso:rule context="id"> 
    <iso:assert test="count(id) = count(id[not(@foo=preceding-sibling::person/@foo)])"> 
    Not all foo attributes of the id elements are unique 
    </iso:assert> 
</iso:rule> 
</iso:pattern> 

Вы также можете добавить проверку для атрибута здесь бар.