У меня есть несколько файлов XML, которые мне нужно «преобразовать» в HTML и отобразить на экране.
Я разработал простой скрипт, который работает почти всегда, используя DOMDocument
и XSLTProcessor
.
Проблема в том, что иногда выдает такую ошибку, а результирующий html — это только часть полного контента:
XSLTProcessor::transformToUri(): Memory allocation failed : reaching arbitrary MAX_URI_LENGTH limit in /var/www/test/index.php on line 14
Это рабочая копия моего скрипта, который выдает ту же ошибку с теми же файлами.
<?php
$xslPath = 'test.xsl';
$xmlString = file_get_contents('test.xml');
$xml = new DOMDocument;
$xml->loadXML($xmlString);
$xsl = new DOMDocument;
$xsl->load($xslPath);
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
$proc->transformToURI($xml, 'php://output');
Я попытался сохранить вывод в файл, но все же у меня возникла та же ошибка, поэтому php://output
не должно быть проблемой. Как я могу решить эту проблему?
EDIT: Похоже, проблема заключается в следующем коде. На самом деле, если я удалю следующие строки, я больше не увижу проблему. Надеюсь, это поможет:
<a name="link" href="data:{$mimeType}/{$format};base64,{normalize-space(Attachment)}" download="{$attachmentName}">
<xsl:value-of select="attachmentName" />
</a>
Само вложение представляет собой pdf-файл base64 (который в данном случае представляет собой строку размером ~ 1 МБ, но может быть и больше)
EDIT 2: Вот что произойдет, если я попытаюсь сгенерировать html с помощью команды xsltproc
из командной строки:
xsltproc --stringparam target cora_cmd test.xsl test.xml > test.html
URI error : Memory allocation failed : reaching arbitrary MAX_URI_LENGTH limit
URI error : Memory allocation failed : escaping URI value
EDIT 3: я попытался заменить transformToURI
на transformToXML
, но безрезультатно. libxml_get_errors()
тоже не показывает результатов.
data
URI для встроенных данных вместо ссылки на отдельный файл стал довольно популярным в последние годы, я не проверял, каково ограничение размера в текущих браузерах, но, возможно, библиотека libxslt или ее встраивание в PHP накладывает какое-то ограничение, которого нет. дольше адекватный. Однако поиск исходников PHP или исходников libxslt на GitHub по MAX_URI_LENGTH ничего не дает. Можете ли вы попробовать запустить свой XSLT через xsltproc, чтобы проверить, возникает ли та же ошибка? - person Martin Honnen   schedule 27.03.2020xsltproc
, я обновляю исходный вопрос - person ToX 82   schedule 27.03.2020