У меня очень большой XML-файл, из которого я извлекаю информацию и преобразую ее в другой формат XML. У меня очень хорошо работает преобразование, поэтому теперь я хотел бы сделать его более гибким, используя PHP для перехода в критерии select=""
.
Ниже приведен рабочий XSLT-код, который я использую (усеченный для простоты):
<xsl:param name="criteria" select="//Product[PublicationDate > 20141231]" /> <xsl:template match="ONIXMessage"> <xsl:for-each select="$criteria"> <xsl:apply-templates select="Title"/> </xsl:for-each> </xsl:template>
Значение $ критериев – выражение XPath, и выше это работает без проблем. Проблема в том, что когда я пытаюсь использовать PHP для передачи другого значения в критерии $:
$proc = new XSLTProcessor; $proc->importStyleSheet( $icml ); $proc->setParameter( "", "criteria", "//Product[Imprint = 'Nightwood']");
Преобразование завершается неудачно, когда я использую setParameter
. Я знаю, что сами выражения точны, потому что transfrom отлично работает, когда я ввожу их непосредственно в XSLT (без PHP).
Насколько я понимаю, проблема в том, что параметр передается как строка, а не как соответствующее выражение XPath, и поэтому XSLT не может разрешить select=""
для набора узлов. Итак, как я могу это предотвратить? Важно передать полное выражение XPath, чтобы я мог изменить критерии для каждого из них, что бы я ни захотел.
Насколько я понимаю, проблема заключается в том, что параметр передается как строка, а не как собственное выражение XPath
Это правильная оценка. Вам нужен процессор, который может оценить строку как выражение XPath. К счастью для вас, процессор libxslt, используемый PHP, поддерживает функцию EXSLT dyn: evaluation () extension .
Без этого вам придется передать параметр в другую таблицу стилей XSLT, функцией которой было бы генерировать XSLT-стилешет, необходимый для фактического преобразования.