Проблема с обработкой XSLT на PHP - PullRequest
0 голосов
/ 03 марта 2011

Я получаю несколько ошибок от XSLTProcessor:

XSLTProcessor::transformToDoc() [<a href='function.XSLTProcessor-transformToDoc'>function.XSLTProcessor-transformToDoc</a>]: Invalid or inclomplete context

XSLTProcessor::transformToDoc() [<a href='function.XSLTProcessor-transformToDoc'>function.XSLTProcessor-transformToDoc</a>]:

XSLTProcessor::transformToDoc() [<a href='function.XSLTProcessor-transformToDoc'>function.XSLTProcessor-transformToDoc</a>]: xsltValueOf: text copy failed in

Что анализирует эту строку XSLT:

<xsl:apply-templates select="page/sections/section" mode="subset"/>

Раздел:

<xsl:template match="page/sections/section" mode="subset">
    <a href="#{shorttitle}">
        <xsl:value-of select="title"/>
    </a>
    <xsl:if test="position() != last()"> | </xsl:if>
</xsl:template>

XML, который анализирует раздел:

   <shorttitle>About</shorttitle>
   <title>#~ About</title>

Код PHP XSLT:

$xslt = new XSLTProcessor();
$XSL = new DOMDocument();

$XSL->load( $xsltFile, LIBXML_NOCDATA);

$xslt->importStylesheet( $XSL );

print $xslt->transformToXML( $XML );

Мое подозрение по поводу ошибок связано с содержанием. Я не получаю этих ошибок при рендеринге Firefox XSLT, а также не получаю недопустимый XML-документ на бэкэнде. Я не получаю ошибок при загрузке, это только функция transformToXML.

Ответы [ 2 ]

1 голос
/ 03 марта 2011

У меня работает (php5.3).

Я немного изменил код, чтобы он запустился, но я не вижу pb с XSLT. Я не сталкивался с сообщением, которое вы описываете.

PHP

<?php

    $xsltFile = "a.xslt";
    $xmlFile = "a.xml";

    $xslt = new XSLTProcessor();
    $xsl = new DOMDocument();
    $xml = new DOMDocument();

    $xsl->load( $xsltFile, LIBXML_NOCDATA);
    $xml->load( $xmlFile, LIBXML_NOCDATA );

    $xslt->importStylesheet( $xsl );

    print $xslt->transformToXML( $xml );

    ?>

XML

<page>
<sections>
<section>
<shorttitle>http://about.com/about.php</shorttitle>
<title>#~ About</title>
</section>
</sections>
</page>

* 1016 XSLT *

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

<xsl:output method="html"/>

<xsl:template match="/">
<xsl:apply-templates select="page/sections/section" mode="subset"/>
</xsl:template>

<xsl:template match="page/sections/section" mode="subset">
    <a href="#{shorttitle}">
        <xsl:value-of select="title"/>
    </a>
    <xsl:if test="position() != last()"> | </xsl:if>
</xsl:template>

</xsl:stylesheet>
0 голосов
/ 03 марта 2011

Если вы сталкиваетесь с ошибками в XSLTProcessor, часто стоит проверить версии версий libxml и libxslt, которые использует ваша система (см .: http://www.php.net/manual/en/xsl.requirements.php). Самый простой способ проверить это - посмотреть на выход

<?php phpinfo(); ?>

Вы ищете «версию libxml» и «версию libxslt, скомпилированную с версией libxml». Возможно, вы используете синтаксис или структуру, которая не поддерживается используемой версией.

Если это не источник вашей проблемы, нам, вероятно, понадобится больше кода, xml и xslt, чтобы у нас был правильный контекст. Как показывает ответ Алена, если вы несколько произвольно завершите свой синтаксис для выполнения, то не будет никаких очевидных проблем.

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