Несколько файлов XML / XSLT в PHP, преобразуйте один с помощью XSLT и добавьте другие, но сначала обработайте его с помощью PHP - PullRequest
0 голосов
/ 10 января 2011

Я правильно обрабатываю преобразования файлов XML с помощью XSLT в PHP.На самом деле я использую этот код:

$xml = new DOMDocument;
$xml->LoadXML($xml_contents);

$xsl = new DOMDocument;
$xsl->load($xsl_file);

$proc = new XSLTProcesoor;
$proc->importStyleSheet($xsl);

echo $proc->transformToXml($xml);

$xml_contents - это XML, обрабатываемый с помощью PHP, для этого сначала нужно включить файл XML, а затем присвоить $xml_contents = ob_get_contents(); ob_end_clean();.Это заставляет обрабатывать PHP-код в XML, и он отлично работает.

Моя проблема заключается в том, что я использую более одного XML-файла, и в этих XML-файлах есть PHP-код, который необходимо обработать И иметьXSLT-файл, связанный с обработкой данных.На самом деле я включаю эти файлы в XSLT со следующим кодом:

<!-- First I add the XML file -->
<xsl:param name="menu" select="document('menu.xml')" />

<!-- Next I add the transformations for menu.xml file -->
<xsl:include href="menu.xsl" />

<!-- Finally, I process it on the actual ("parent") XML -->
<xsl:apply-templates select="$menu/menu" />

Мой вопрос - как мне справиться с этим.Мне нужно добавить несколько файлов XML (+ XSLT) в мой первый файл XML, который будет содержать PHP, поэтому его необходимо обработать.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 11 января 2011

2 решения, возможно, одно из них будет в порядке.

Не проверено, но вы можете реализовать собственный поток в PHP.

<?php

// define your custom stream, should process xslt
class CustomStream extends streamWrapper {
    // http://www.php.net/manual/en/class.streamwrapper.php
}

// declare your custom stream
stream_wrapper_register('extra', 'CustomStream');

// then load your preprocessed on the fly in your example.xsl
$xml_contents = <<<EOF
...
<xsl:param name="menu" select="document('extra://menu.xml')" />
EOF;


?>

Решение № 2, зарегистрируйте php-функции в вашем xslt и поиграйте с ним:

<?php
// declare your function
// see http://www.php.net/manual/fr/xsltprocessor.registerphpfunctions.php
function resolve($xml_contents, $xsl_file=null) {
    $dom = new DomDocument;
    $dom->loadXML($xml_contents);
    if ($xsl == null) {
        return $dom;
    }

    $xsl = new DOMDocument;
    $xsl->load($xsl_file);

    $proc = new XSLTProcessor;

    $proc->registerPHPFunctions('resolve');
    $proc->importStyleSheet($xsl);

    return $proc->transformToDoc($xml_contents);
}


// then handle your master xsl
$xsl_contents = <<<EOF
...
<xsl:param name="menu" select="php:function('resolve', 'menu.xml', 'menu.xsl')" />
EOF;

$dom = new DomDocument;
$dom->loadXML($xml_contents);

$xsl = new DOMDocument;
$xsl->loadXML($xsl_contents);

$proc = new XSLTProcessor;

$proc->registerPHPFunctions('resolve');
$proc->importStyleSheet($xsl);

return $proc->transformToDoc($xml_contents);

?>
0 голосов
/ 11 января 2011

Я не уверен, что вы подразумеваете под "XML-файлом, который будет содержать PHP", но я предполагаю, что вам нужен php, чтобы мешать обработке XSLT после ее запуска. В противном случае вы будете использовать PHP для манипулирования исходным XML до любого запуска XSLT-преобразования.

Есть функция php, которая позволяет запускать произвольный php внутри таблицы стилей XSLT во время обработки, хотя это расширение стандартного XSLT.

Есть больше информации и примеров .

EDIT:

Во-вторых, если вам просто нужно указать, какой XML загружать без его жесткого кодирования в XSLT, функция document () может использовать исходные узлы XML для имен загружаемых файлов. Таким образом, вы просто генерируете имена в XML, и затем document () считывает их для дальнейшего использования в шаблоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...