xml — загрузить xsl, который использует xslt в переполнении стека

недавно мы получили новый файл xsl, который использует XSLT пространство имен:

XMLNS: дата = «http://exslt.org/dates-and-times»

и где-то в xsl он вызывает следующую функцию:

<xsl:value-of select="date:format-date(concat('1900-', @month, '-1'),'MMM')"/>

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

вот как я называю файл xsl:

    $xsl_doc = new DOMDocument();
$xsl_doc->load("stylesheet/report.xsl"); //load the stylesheet
$xml_doc = new DOMDocument();
$xml_doc->loadXML($xml); //load the xml
$proc = new XSLTProcessor();
$proc->importStylesheet($xsl_doc);
$newdom = $proc->transformToDoc($xml_doc);

более того, когда я ввожу этот адрес в браузереhttp://exslt.org/dates-and-times это ошибка возврата 404

это ошибка, которую я получаю на первом месте:

Warning: XSLTProcessor::transformToDoc() [xsltprocessor.transformtodoc]: runtime error: file file: stylesheet/section_b.xsl line 64 element value-of in \Application\_preview.php on line 25

Warning: XSLTProcessor::transformToDoc() [xsltprocessor.transformtodoc]: XPath evaluation returned no result. in \Application\_preview.php on line 25

как вы можете видеть это выбросить ошибку в строке 64, которая является местом format-date функция используется

в XSLT На веб-сайте упоминается об импорте функции в xslt, поэтому я загружаю date.zip, распаковываю и добавляю следующий код в файл xsl, первые 3 строки xsl выглядят следующим образом:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:response="http://ws.mywebsite.com.my/myosnet/response"xmlns:date="http://exslt.org/dates-and-times"version="1.0">

<xsl:import href="ext_module/date/date.xsl" />

Затем я попытался загрузить снова, но все равно через ошибку назад

   Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: compilation error: file file: stylesheet/ext_module/date/functions/format-date/date.format-date.xsl line 5 element import in \Application\_preview.php on line 24

Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: xsltParseStylesheetTop: ignoring misplaced import element in \Application\_preview.php on line 24

Warning: XSLTProcessor::transformToDoc() [xsltprocessor.transformtodoc]: No stylesheet associated to this object in \Application\_preview.php on line 25

Fatal error: Call to a member function saveHTML() on a non-object in \Application\_preview.php on line 26

Я даже пытался перенести определение функции в date.format.xsl, но мне не удалось.
мой вопрос, как добавить эти пользовательские функции. или как заставить его использовать прокси.

0

Решение

проблема в том, что сервер находится за прокси, поэтому, когда я использую следующие
код не может найти пространство имен

Я не думаю, что это правильный анализ. URI пространства имен — это просто бессмысленная строка — процессор XSLT не пытается его «найти».

Гораздо более вероятная причина в том, что ваш процессор не поддерживает функцию расширения EXSLT date: format-date (). На самом деле, я не знаю ни одного процессора XSLT 1.0, который бы это делал, поэтому странно, что кто-то написал бы таблицу стилей, используя его.

Вы можете проверить это, запустив следующую таблицу стилей (для любого допустимого XML-ввода):

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:date="http://exslt.org/dates-and-times">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/">

<xsl:text>Vendor: </xsl:text>
<xsl:value-of select="system-property('xsl:vendor')"/>
<xsl:text>&#010;Version: </xsl:text>
<xsl:value-of select="system-property('xsl:version')"/>
<xsl:text>&#010;Testing function: </xsl:text>
<xsl:choose>
<xsl:when test="function-available('date:format-date()')">
<xsl:value-of select="date:format-date('1900-05-01', 'MMM')" />
</xsl:when>
<xsl:otherwise>
<xsl:text>format-date() is not available</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet>

AFAIK, PHP использует процессор libxslt, поэтому вы должны увидеть следующий результат:

<?xml version="1.0" encoding="utf-8"?>
Vendor: libxslt
Version: 1.0
Testing function: format-date() is not available

Другая проблема заключается в неправильном вызове функции:

concat('1900-', @month, '-1')

не производит действительную дату.

Теперь, поскольку кажется, что единственная причина для вызова функции здесь — это форматирование месяца как MMM, самое простое решение — заменить весь вызов функции:

<xsl:value-of select="date:format-date(concat('1900-', @month, '-1'),'MMM')"/>

с:

<xsl:value-of select="substring('JanFebMarAprMayJunJulAugSepOctNovDec', 3*(@month - 1) + 1, 3)" />
2

Другие решения

Я решил проблему, добавив функцию date:format-date к xslt, выполнив следующий шаг:

против инструкции exslt для перевода PHP просто .function Файл достаточно и не должен импортировать основной файл.

поэтому сначала я скачал соответствующие файлы с exslt.org, в моем случае я скачал date.zip, в zip-файле есть много файлов, которые просто .function файл нужен. добавил следующий код в xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"xmlns:response="http://ws.mywebsite.com.my/myosnet/response"xmlns:date="http://exslt.org/dates-and-times"version="1.0">

<xsl:import href="ext_module/date/date.format-date.function.xsl" />

в date.format-date.function.xsl я заметил, это импортирует другую зависимость, поэтому я загрузил строковую зависимость и связал их вместе, скопировав str.padding.function.xsl сразу после date.format-date.function.xsl,

здесь ошибка php исправлена, но данные не отображаются должным образом, поэтому я прочитал format-date и заметил, что функция проверяет длину, чтобы точно определить год-месяц-день, и если, скажем, день не будет в формате 2-х символов, то он не будет работать. поэтому я изменил @month с введением новой переменной и изменил длину @month

<xsl:variable name="hnmnth">
<xsl:number value="@month" format="01" />
</xsl:variable>

и изменил вызов на функцию:

<xsl:value-of select="date:format-date(concat('1900-', $hnmnth, '-01'),'MMM')"/>
0

По вопросам рекламы [email protected]