Войти

Показать полную графическую версию : PHP и XML | Обработка неалфавитных символов


Coutty
16-12-2008, 17:23
Скрипт генерирует XML-документ, после чего тот скармливается XSLT-процессору.

Скрипт:

<?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 нормальный получается)



<?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
<xsl:output
method="xml"
encoding="UTF-8"
indent="yes"... »
так аутпут метод то xml или html? имхо
<xsl:output method="html"... />

Coutty
17-12-2008, 08:13
Пробовал и xml, и html - результат один и тот же.

Sham
17-12-2008, 08:28
<xsl:value-of select="page" />
предлагаю
<xsl:value-of select="page" disable-output-escaping="yes" />

Coutty
17-12-2008, 08:35
Да, это помогло. Спасибо)
Но почему-то на некоторых форумах, найденных гуглом, пишут, что 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
disable-output-escaping="yes" не рекомендуется к употреблению »
Поскольку запрет на маскирование при выводе может работать не на всех XSLT процессорах и может создавать XML документы, которые будут некорректны, то этот режим должен использоваться только тогда, когда нет других альтернатив.
тут (http://www.rol.ru/news/it/helpdesk/xslt01.htm#output) мне кажется будет понятно (спецификация)...

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

Хотя про ENTITY я немного не понял. Значит, их надо описать в DTD примерно так:
<!DOCTYPE content[
<!ENTITY nbsp " ">
<!ENTITY laquo "«">
<!ENTITY raquo "»">
]>
Но как в PHP прикрепить DTD к XML - не знаю... Пробовал через DOMDocument::createEntityReference (http://ru2.php.net/manual/ru/domdocument.createentityreference.php), но оно при использовании "в лоб" просто добавляет строку & n b s p ; (или другую сущность) в конец XML, разрушая структуру.


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




© OSzone.net 2001-2012