Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   PHP и XML | Обработка неалфавитных символов (http://forum.oszone.net/showthread.php?t=126155)

Coutty 16-12-2008 17:23 982104

PHP и XML | Обработка неалфавитных символов
 
Скрипт генерирует XML-документ, после чего тот скармливается XSLT-процессору.

Скрипт:
PHP код:

<?php
// содержимое
$title "& # 1 7 1 ; Супер заголовок & # 1 8 7 ; ";
$content "<h2>Доставка</h2>";

// создаём XML
$xml = new DOMDocument('1.0','UTF-8');
$xml->formatOutput 1;

// корневой элемент
$nodeRoot $xml->createElement("content");
$xml->appendChild($nodeRoot);

// тэг title
$nodeTitle $xml->createElement("title"$title);
$nodeRoot->appendChild($nodeTitle);

// тэг page
$nodePage $xml->createElement("page"$content);
$nodeRoot->appendChild($nodePage);
...
?>

В общем, получается такой XML:
Код:

<?xml version="1.0" encoding="UTF-8"?>
<content page="delivery">
  <title>«Супер заголовок»</title>
  <page>& l t ; h2 & g t ; Доставка & l t ; /h2 & g t ; </page>
</content>

Пробелов это я понаставил.

И после обработки XSLT-процессором, разумеется, ни одного тэга из page на странице не получается. Все вот так с амперсандами на странице и выводятся.
Если в CDATA вставлять данные, то всё равно с амперсандами выходит, но уже после XSL-обработки (XML нормальный получается)

Вот такой вот XSL: (см. далее)

Код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
method="xml"
encoding="UTF-8"
indent="yes"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" 
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" />
<xsl:template match="content">
<html>
<head>
        <title><xsl:value-of select="title"/></title>
</head>

<body>
        <xsl:value-of select="page" />
</body>
</html>
</xsl:template>
</xsl:stylesheet>



Непонятно... Что с ним делать?

Sham 17-12-2008 01:38 982511

Цитата:

Цитата Coutty
Код:

<xsl:output
method="xml"
encoding="UTF-8"
indent="yes"...

»

так аутпут метод то xml или html? имхо
Код:

<xsl:output method="html"... />

Coutty 17-12-2008 08:13 982615

Пробовал и xml, и html - результат один и тот же.

Sham 17-12-2008 08:28 982622

Цитата:

Цитата Coutty
Код:

<xsl:value-of select="page" />

предлагаю
Код:

<xsl:value-of select="page" disable-output-escaping="yes" />

Coutty 17-12-2008 08:35 982626

Да, это помогло. Спасибо)
Но почему-то на некоторых форумах, найденных гуглом, пишут, что disable-output-escaping="yes" не рекомендуется к употреблению. Что в нём не так?

А как обрабатывать символы типа & n b s p ; в XML-документе? XSL выдаёт на них ошибку Entity 'nbsp' not defined in Entity. Неужели только юникод-последовательностями & # 1 6 0 ; и подобными? Это ж сильно непривычно...

Sham 17-12-2008 09:26 982670

Цитата:

Цитата Coutty
disable-output-escaping="yes" не рекомендуется к употреблению »

Цитата:

Цитата http://www.rol.ru/news/it/helpdesk/xslt01.htm#disable-output-escaping
Поскольку запрет на маскирование при выводе может работать не на всех XSLT процессорах и может создавать XML документы, которые будут некорректны, то этот режим должен использоваться только тогда, когда нет других альтернатив.

тут мне кажется будет понятно (спецификация)...

Coutty 17-12-2008 10:42 982756

Да, такой документ у меня есть. Я только не дочитал его :)
Ну, если проблема только в возможности создания некорректного XML, то вполне можно пользоваться для своих целей.

Хотя про ENTITY я немного не понял. Значит, их надо описать в DTD примерно так:
Код:

<!DOCTYPE content[
  <!ENTITY nbsp " ">
  <!ENTITY laquo "«">
  <!ENTITY raquo "»">
]>

Но как в PHP прикрепить DTD к XML - не знаю... Пробовал через DOMDocument::createEntityReference, но оно при использовании "в лоб" просто добавляет строку & n b s p ; (или другую сущность) в конец XML, разрушая структуру.

PHP код:

$en1 $xml->createEntityReference('laquo');
$xml->appendChild($en1);
$en1T $xml->createTextNode("«");
$en1->appendChild($en1T); 



Время: 16:25.

Время: 16:25.
© OSzone.net 2001-