Проверка XML с помощью Schematron в PHP 5

У меня проблема с проверкой XML с помощью schematron.

В моем коде я загружаю XML и XSL как объекты DOMDocument и пытаюсь преобразовать:

$domSche = new DOMDocument();
$domSche->loadXML($message);

$domXSLSche = new DOMDocument();
$domXSLSche->load("CI-SIS_StructurationCommuneCDAr2.xsl");

$xsltsche = new XSLTProcessor();
$xsltsche->importStylesheet($domXSLSche);

$XSLValid = $xsltsche->transformToXml($domSche);

Но функция возвращает эту ошибку:

XSLTProcessor::transformToXml(): С этим объектом не связана таблица стилей

Я не понимаю, технически importStylesheet связывает мой XSL с XML, не так ли?

Если кто-то хочет посмотреть больше источников, файлы находятся по адресу:


person Prolasky    schedule 25.02.2013    source источник
comment
См. также: stackoverflow.com/q/4822914/287948   -  person Peter Krauss    schedule 28.07.2014


Ответы (1)


Версия Schematron, которую вы используете, не требует XSL 2.0, однако файл, который у вас есть, использует функции XSL 2.0.

XSLTProcessor в PHP поддерживает только XSL 1.0. Поэтому некоторые функции, используемые в этом файле, недоступны, что приводит к сбою импорта.

Поскольку таблицу стилей не удалось импортировать, трансформация не может быть запущена.


Сообщение об ошибке

Предупреждение: XSLTProcessor::transformToXml(): с этим объектом не связана таблица стилей.

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

Это потому, что он имеет ошибки и, наконец, не может быть скомпилирован.

В вашем случае у вас есть файл XSL версии 2.0, но PHP поддерживает только функции 1.0. Также он использует переменные, которые не установлены (определены). Когда я загружаю данные вашего примера, я получаю следующие ошибки:

Предупреждение: XSLTProcessor::importStylesheet(): ошибка компиляции: файл CI-SIS_StructurationCommuneCDAr2.xsl, строка 13, таблица стилей элемента

Который:

            version="2.0">

и объясняется следующим предупреждением:

Предупреждение: XSLTProcessor::importStylesheet(): xsl:version: поддерживаются только функции 1.0

Далее идет неопределенная переменная:

Предупреждение: XSLTProcessor::importStylesheet(): неопределенная переменная

Предупреждение: XSLTProcessor::importStylesheet(): ошибка компиляции: шаблон элемента строки CI-SIS_StructurationCommuneCDAr2.xsl 4974

который

    <!--RULE -->
    <xsl:template match="*[cda:templateId/@root = $templateObservationMedia]" priority="1000"
                  mode="M62">

которая является переменной $templateObservationMedia и приводит к

Предупреждение: XSLTProcessor::importStylesheet(): не удалось скомпилировать предикат

Чтобы это заработало, вам нужно как минимум исправить эти проблемы. Поскольку использование переменной внутри шаблона соответствия не является XSLT 1.0, вам нужно как минимум обойти это. См. Несколько предупреждений PHP в XSLTProcessor::importStylesheet() для расширенного обсуждения проблемы переменной/соответствия.

person hakre    schedule 05.03.2013