2017-01-27 9 views
1

У меня есть XML-фрагмент, как например:Как написать этот тест проверки Schematron для фрагмента XML?

<AAA> 
    <Field name="a"/> 
    <Field name="b"/> 
    <Field name="x"/> 
    <User id="x" id2="f"/> 
    <User id="y"/> 
</AAA> 
<AAA> 
    <Field name="r"/> 
    <Field name="z"/> 
</AAA> 

Мне нужно исключить, что если тег пользователя существует, то он должен проверить, существует ли значение атрибутов id и id2 под name Атрибут поля.

Таким образом, в первом AAA тег, он будет проверять и дать 2 ошибки, потому что "f" не существует как имя поля и ни делает "y".

теги ААА не всегда имеют метки пользователя, а теги пользователя не всегда есть как id и id2.

Я уже возился с некоторыми выражениями XPath, но безрезультатно.

+1

Вы используете Schematron с XPath 2.0 или 1.0? В XPath 2.0 вы можете легко написать 'some $ user в User не удовлетворяет ($ user/(@ id, @ id2) = Field/@ name'. –

+0

Это не совсем так. – user3418847

+1

Просьба показать полный входной XML-документ Спасибо, тоже, «это не совсем так» - это не очень точное сообщение об ошибке. Что именно не сработало? –

ответ

2

Если вы не можете использовать XPath 2.0, то вы могли бы написать следующие правила Schematron:

ISO Schematron

<?xml version="1.0" encoding="UTF-8"?> 
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"> 

    <sch:pattern> 
     <sch:rule context="User[@id]"> 
      <sch:assert test="@id = ../Field/@name">User ID does not exist as a field!</sch:assert> 
     </sch:rule> 

     <sch:rule context="User[@id2]"> 
      <sch:assert test="@id2 = ../Field/@name">User ID2 does not exist as a field!</sch:assert> 
     </sch:rule> 
    </sch:pattern> 

</sch:schema> 

Я предполагаю, что документ ввода XML, который не имеет пространства имен. Утверждение не прерывается, если элемент User не имеет одного из этих атрибутов в первую очередь или если элемент AAA не имеет элемента User.

Вы не сказали очень четко, почему предложение Мартина Хоннен не сработало для вас, поэтому я перечислил его здесь. Правило будет выглядеть так:

<sch:pattern> 
    <sch:rule context="AAA"> 
     <sch:report test="some $user in User satisfies not($user/(@id, @id2) = Field/@name)">User ID does not exist as a field!</sch:report> 
    </sch:rule> 
</sch:pattern> 
+0

Большое спасибо! Это сделало. Мне не удалось показать стек или еще что-нибудь потому что у меня нет возможности отлаживать мои утверждения о схематике. Я не знал, что я возвращаю, но я знал, что я возвращаюсь, было неправильно. – user3418847