2013-04-21 1 views
0

У меня есть xml.XSD - Проверить элемент, который является значением атрибута

<a> 
    <thing tag="song1"> 
    <name>john doe</name> 
    <email>[email protected]</email> 
    </thing> 
    <owner thing="https://stackoverflow.com/a/thing[@tag='song1']"> 
    ... 
    </owner> 
</a> 

Я хочу утверждать в XSD, что, когда «вещь» с тегом «SONG1» присутствует «владелец» должен иметь вещь = «/ а/вещь [@ тег =» SONG1' ].

Моя логическая попытка в XSD является

<sch:assert 
    test="(count(a:owner[@thing=a:thing[@tag='song1']]) > 0) = count(a:thing[@tag='song1']) > 0))">Error</sch:assert> 
     </sch:rule> 

Oxygen валидатор дает ошибку для этого XSD. Пожалуйста помоги. Благодарю.

ответ

0

Наконец-то я закончил проверять подстроку для песни1 следующим образом.

test="(count(a:thing[substring(@tag,19,8) = 'song1']) > 0)"> 

Это не идеальный способ, как/а/вещь и /./a/thing одинаково хорошо, но насколько я знаю, пользователи придерживаться той же схеме. Также в идеальном мире этот случай должен быть проверен во время выполнения.

Надеюсь, это поможет.

0

Вам нужна функция, которая принимает выражение XPath в виде строки и возвращает результат ее оценки. Это доступно в саксонии как саксон: оцените().

Во-вторых, утверждения простого типа имеют доступ только к проверяемой строке; утверждения на сложном типе имеют доступ к дереву, укорененному на узле элемента. Выражение пути начинается с «/» и поэтому работает только на дереве, укорененном на узле документа. Если вы изменили путь до ../a/thing[@tag='song1'], тогда вы можете подтвердить его утверждением по элементу формы

assert test="every $o in owner satisfies exists(saxon:evaluate($o/@thing))"