-
Вебмастеру
(
http://forum.oszone.net/forumdisplay.php?f=22)
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>
Непонятно... Что с ним делать?
|
Цитата:
Цитата 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 - результат один и тот же.
|
Цитата:
Цитата 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 ; и подобными? Это ж сильно непривычно...
|
Цитата:
Цитата 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.
© OSzone.net 2001-