Подтвердите 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, нет?
Если кто-то хочет посмотреть больше источников, файлы находятся по адресу:
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 line 13 стилей таблицы элементов
Который:
version="2.0">
и объяснил следующее предупреждение:
Предупреждение: XSLTProcessor::importStylesheet(): xsl: версия: поддерживаются только функции 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 () для расширенного обсуждения проблемы переменной / соответствия.