проверка XSD с использованием Schematron - PullRequest
5 голосов
/ 30 июня 2010

Я пытаюсь добавить проверку Schematron для моего xsd. Это мой новый xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    xmlns:sch="http://www.ascc.net/xml/schematron"    
    elementFormDefault="qualified" &gt;

 <xs:element name="books"> 
  <xs:complextype>
   <xs:sequence>   ;P 
    <xs:element name="book" type="bookType" maxoccurs="unbounded">
      <xs:annotation>
       <xs:appinfo>
        <sch:pattern id="onLoanTests" xmlns:sch="http://purl.oclc.org/dsdl/schematron">
          <sch:rule context="book">
           <sch:report test="@on-loan and not(@return-date)">
           Every book that is on loan must have a return date
           </sch:report>
          </sch:rule>
        </sch:pattern>
       </xs:appinfo>
      </xs:annotation>
    </xs:element>
   </xs:sequence> 
  </xs:complextype>
 </xs:element>

 <xs:complextype name="bookType">
  <xs:sequence>
   <xs:element name="title" type="xs:string" />
   <xs:element name="author" type="xs:string" />
   <xs:element name="publication-date" type="xs:string" />
  </xs:sequence>
  <xs:attribute name="publisher" type="xs:string" use="required" />
  <xs:attribute name="on-loan" type="xs:string" use="required" />
  <xs:attribute name="return-date" type="xs:string" use="optional" />
 </xs:complextype>

</xs:schema>

Это мой тестовый xml:

<books>
<book publisher="ddd" on-loan="sdsd">
  <title>idan title</title> 
  <author>idan author</author> 
  <publication-date>idan date</publication-date> 
</book>
</books>

Используя предоставленный мною xml, я не получаю ошибку проверки.

Я предполагал, что получу сообщение «Каждая книга, которая находится в аренде, должна иметь дату возврата», и что XML не будет действительным. Предложения почему?

Обновление Мне удалось заставить его работать с помощью проверки схематматрона в oXygen xml editor. Тем не менее, как я должен использовать в моем коде? Нужно ли устанавливать что-то особенное? ссылка на другую библиотеку?

Update2 Видимо здесь в разделе «Обработка», все необходимые шаги подробно описаны.

1 Ответ

8 голосов
/ 03 сентября 2010

Ваше второе обновление, вероятно, лучшая ссылка на тему.Сам по себе XSD не позволяет использовать механизм для проверки по схематрону, а также по самой схеме.Элемент xsd:appinfo позволяет вставлять информацию проверки для другого языка схемы, но она предназначена специально для использования в приложении (отсюда и название).

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

  1. Использование XSLT для извлечения правил схематора из вашего XSD
  2. Использование эталонной реализации XSLT из schematron.com для преобразования схемы в XSLT
  3. Проверка вашего экземпляра документа по XSD
  4. Проверка вашего экземпляра документа по схематрону путем обработки XSLT, созданного в 2.

В зависимости от вашей среды вы можете рассмотреть возможность реализации XProc ( calabash или calumet ) для достижения этого конвейера.

...