Как найти проблему с PHP XSLTProcessor, когда return из transformToXML имеет значение false и libxml_get_errors ничего не возвращает - PullRequest
1 голос
/ 06 июня 2010

Я работаю над кодом ниже, чтобы позволить пользовательским агентам HTTP, которые не могут выполнять преобразования XSL, просматривать ресурсы на моем сервере. Я озадачен, потому что результатом transformToXML является false, но результатом libxml_get_errors() является пустой массив. Как видите, код выводит идентификатор версии LibXSLT, и у меня возникает проблема с WinVista с версией 1.1.24. Не является ли libxml_get_errors() неправильной функцией для получения ошибок от объекта XSLTProcessor?

Если вы заинтересованы в документах XML, вы можете получить их из http://bobberinteractive.com/index.xhtml и ... / stylesheets / layout.xsl


<?php
//redirect browsers that can handle the source files.
if (strpos ( $_SERVER ['HTTP_ACCEPT'], 'application/xhtml+xml' )) {
 header ( "HTTP/1.1 301 Moved Permanently" );
 header ( "Location: http://" . $_SERVER ['SERVER_NAME'] . "/index.xhtml" );
 header ( "Content-Type: text/text" );
 echo "\nYour browser is capable of processing the <a href='/index.xhtml'> site contents on its own.";
 die ();
}
//start by checking the template
$baseDir = dirname ( __FILE__ );
$xslDoc = new DOMDocument ();
if (! $xslDoc->load ( $baseDir . '/stylesheets/layout.xsl' )) {
 header ( "HTTP/1.1 500 Server Error" );
 header ( "Content-Type: text/plain" );
 echo "\n Can't load " . $baseDir . '/stylesheets/layout.xsl';
 die ();
}

//resolve the requested resource (browsers that need transformation will request the resource without the suffix)
$uri = $_SERVER ['REQUEST_URI'];
$len = strlen ( $uri );
if (1 >= $len || '/' == substr ( $uri, $len - 1 )) {
 $fileName = $baseDir . "/index.xhtml"; // use 'default' document if pathname ends in '/'
} else {
 $fileName = $baseDir . (1 load ( $fileName )) {
 header ( "HTTP/1.1 500 Server Error" );
 echo "\n Can't load " . $fileName;
 die ();
}
// now start the XSL template processing
$proc = new XSLTProcessor ();
$proc->importStylesheet ( $xslDoc );
$doc = $proc->transformToXML ( $xmlDoc );
if (false === $doc) {
 header ( "HTTP/1.1 500 Server Error" );
 header ( "Content-Type: text/plain" );
 echo "\n";
 // HERE is where it gets strange: the value of $doc is false and libxml_get_errors returns 0 entries.
 display_xml_errors ( libxml_get_errors() );
 die ();
}
header ( "Content-Type: text/html" );
echo "\n";
echo $doc;

function display_xml_errors($errors) {
 echo count ( $errors ) . " Error(s) from LibXSLT " . LIBXSLT_DOTTED_VERSION;
 for($i = 0; $i level) {
   case LIBXML_ERR_WARNING :
    $return .= "Warning $error->code: ";
    break;
   case LIBXML_ERR_ERROR :
    $return .= "Error $error->code: ";
    break;
   case LIBXML_ERR_FATAL :
    $return .= "Fatal Error $error->code: ";
    break;
  }

  $return .= trim ( $error->message ) . "\n  Line: $error->line" . "\n  Column: $error->column";

  if ($error->file) {
   $return .= "\n  File: $error->file";
  }

  echo "$return\n\n--------------------------------------------\n\n";
 }
}

1 Ответ

2 голосов
/ 06 июня 2010

Я получаю несколько ошибок при загрузке вашего XML или выполнении XSL. Обновите ваш error_reporting level

error_reporting(E_ALL | E_STRICT);
// or
error_reporting(-1); // overzealous, but works

Получил меня:

PHP Warning:  DOMDocument::load(): Entity 'ndash' not defined in /tmp/index.xhtml, line: 8 in /tmp/test.php on line 4
PHP Warning:  XSLTProcessor::importStylesheet(): compilation error: file /tmp/layout.xsl line 59 element a in /tmp/test.php on line 10
PHP Warning:  XSLTProcessor::importStylesheet(): Attribute 'onclick': The content is expected to be a single text node when compiling an AVT. in /tmp/test.php on line 10
PHP Warning:  XSLTProcessor::importStylesheet(): compilation error: file /tmp/layout.xsl line 185 element a in /tmp/test.php on line 10
PHP Warning:  XSLTProcessor::importStylesheet(): Attribute 'onclick': The content is expected to be a single text node when compiling an AVT. in /tmp/test.php on line 10
PHP Warning:  XSLTProcessor::transformToXml(): No stylesheet associated to this object in /tmp/test.php on line 12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...