SimpleXML Xpath-запрос и transformToXML - PullRequest
1 голос
/ 20 июня 2011

У меня есть XML-документ, который я пытаюсь запросить с помощью xpath, а затем запустить полученный узел через XSLTProcessor.Запрос xpath работает нормально, но я не могу понять, как использовать SimpleXMLElement с XSLTProcessor.Любая помощь будет оценена.

$data = simplexml_load_file('document.xml');
$xml = $data->xpath('/nodes/node[1]');
$processor = new XSLTProcessor;
$xsl = simplexml_load_file('template.xsl');
$processor->importStyleSheet($xsl);
echo '<div>'.$processor->transformToXML($xml).'</div>';

XML:

<nodes>
    <node id="5">
        <title>Title</title>
    </node>
</nodes>

XSL:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="//node">
<xsl:value-of select="@id" />
<xsl:value-of select="title" />
...

1 Ответ

0 голосов
/ 21 июня 2011

Я думаю, что вы не можете передать этот $xml методу XSLTProcessor::transformToXML, потому что это массив (произведенный SimpleXMLElement::xpath):

Предупреждение PHP: XSLTProcessor :: transformToXml () ожидает, что параметр 1 будет объектом, массив, указанный в /var/www/index.php в строке 11

Простое средство для этого - просто поместитьВыражение XPath в таблицу стилей XSL:

<xsl:output method="html"/> <!-- don't embed XML declaration -->

<xsl:template match="/nodes/node[1]">
    <xsl:value-of select="@id"/>
    <xsl:value-of select="title"/>
</xsl:template>

и:

$xml = simplexml_load_file('document.xml');
$xsl = simplexml_load_file('template.xsl');

$xslt = new XSLTProcessor;
$xslt->importStyleSheet($xsl);

echo '<div>'.$xslt->transformToXML($xml).'</div>';

РЕДАКТИРОВАТЬ:

Другой способ - просто использовать первый элемент массивав XSL-преобразовании (убедитесь, что оно не равно нулю):

$data = simplexml_load_file('document.xml');
$xpath = $data->xpath('/nodes/node[1]');
$xml = $xpath[0];

$xsl = simplexml_load_file('template.xsl');

$xslt = new XSLTProcessor;
$xslt->importStyleSheet($xsl);

echo '<div>'.$xslt->transformToXML($xml).'</div>';

и:

<xsl:template match="node">
    <xsl:value-of select="@id"/>
    <xsl:value-of select="title"/>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...