Правильно ли я сделал PHP,XML,XSLT

Stalkerok

Новичок
Правильно ли я сделал PHP,XML,XSLT

Вот сделал!
Как такая реализация, что файл xml формируется из БД(наподобии примера) для постраничного вывода или новостей?
и почему при русских буквах даже если сменить кодировку выводится иероглифы.

index.php
PHP:
<?
$sXML = new DOMDocument();
$root = $sXML->createElement("source");
$sXML->appendChild($root);
$item = $sXML->createElement("title");
$root->appendChild($item);
$text = $sXML->createTextNode("XSL");
$item->appendChild($text);
$item = $sXML->createElement("author");
$root->appendChild($item);
$text = $sXML->createTextNode("John Smith");
$item->appendChild($text);
$xsldoc  = new DOMDocument;
$xsldoc->load('test.xsl');
$proc = new XSLTProcessor(); 
$proc->importStyleSheet($xsldoc); 
echo $proc->transformToXML($sXML); 
?>
test.xsl
PHP:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
<xsl:template match="/">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title><xsl:value-of select="//title"/></title>
</head>

<body>
<h1><xsl:value-of select="//title"/></h1>
<h2><xsl:value-of select="//author"/> </h2>
</body>
</html>

</xsl:template>
</xsl:stylesheet>
 

AmdY

Пью пиво
Команда форума
у тебя файлы в которых код, точно в кодировке utf-8
и посылай заголовки
 

Stalkerok

Новичок
а как послать заголовок? а сделал то верно? в том направлении иду?
 

AmdY

Пью пиво
Команда форума
header("Content-Type: text/html; charset=utf-8");
а где собствеено русские буковки в приведённом примере

//title - это плохая выборка, при большом количестве данных могут быть накладки
 

AmdY

Пью пиво
Команда форума
header("Content-Type: text/html; charset=utf-8");
echo $proc->transformToXML($sXML);
кстати, почему $sXML - это же не строка, а объект $oXML
 

Stalkerok

Новичок
AmdY спасибо! учту.

-~{}~ 15.01.08 19:37:

белиберда какаято получается или я что то...

кодировка XSL - encoding="utf-8" если поменять на charset=windows-1251 то ошибка (предупреждение).

если так

header("Content-Type: text/html; charset=utf-8");
то выводит знаки вопроса в ромбе,

если так
header("Content-Type: text/html; charset=windows-1251");
то всё хорошо но смущает в

HTML
как быть или это не имеют значения?
 

Gas

может по одной?
Автор Штирлиц, у него "ошибка (предупреждение)".
А тут известный форум телепатов, сами догаются.
 

Stalkerok

Новичок
при 1251
Warning: XSLTProcessor::transformToXml() [function.XSLTProcessor-transformToXml]: output conversion failed due to conv error, bytes 0xF1 0xEE 0xF0 0xEE in Z:\home\test\www\index.php on line 19
 

Gas

может по одной?
AmdY
да весь код то вриведён, просто данные из базы в windows-1251, а результирующая кодировка стоит utf-8.

Stalkerok
или кодируй данные, которые вставляешь в xml в utf-8, или попробуй при создании объекта DOMDocument передать в конструктор windows-1251 и chraset в xsl задать тоже.
 

AmdY

Пью пиво
Команда форума
тьфу ты, точно, данные из бд, а то мне показалось что от сам формирует ручками, ввело в заблуждение sXML->createTextNode("John Smith");
очень распостранённая ошибка, когда ставят энколинг утф, а сам файл сохраняют в блокноте в windows-1251
 

Stalkerok

Новичок
попробовал убрать проблему с русским текстом.

index.php
PHP:
<?

function convert ($text) {
return iconv("windows-1251", "UTF-8",$text);
}

$oXML = new DOMDocument("1.0","windows-1251");
$root = $oXML->createElement("source");
$oXML->appendChild($root);
$item = $oXML->createElement("title");
$root->appendChild($item);
$text = $oXML->createTextNode("XSL");
$item->appendChild($text);
$item = $oXML->createElement("author");
$root->appendChild($item);
$text = $oXML->createTextNode(convert("пример"));
$item->appendChild($text);

$xsldoc  = new DOMDocument;
$xsldoc->load('test.xsl');
$proc = new XSLTProcessor(); 
$proc->importStyleSheet($xsldoc);

echo $proc->transformToXML($oXML);
?>

test.xsl
PHP:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="windows-1251" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd"/>
<xsl:template match="/">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/>
<title><xsl:value-of select="//title"/></title>
</head>

<body>
<h1><xsl:value-of select="//title"/></h1>
<h2><xsl:value-of select="//author"/> </h2>
</body>
</html>

</xsl:template>
</xsl:stylesheet>
 

Stalkerok

Новичок
нет не может быть оба файла я редактировал в обычном блокноте.
 

dimagolov

Новичок
Stalkerok
ага. а обычный блокнот не умеет утф читать-писать будто.
посмотри в hex-е на файл, на то место где русские буквы.
 

AmdY

Пью пиво
Команда форума
плин, совсем запутал, пришлось пробовать у ся. даж обидно стало.

index.php
PHP:
<?php 
$oXML = new DOMDocument("1.0","windows-1251"); 
$root = $oXML->createElement("source"); 
$oXML->appendChild($root); 
$item = $oXML->createElement("title"); 
$root->appendChild($item); 
$text = $oXML->createTextNode("XSL"); 
$item->appendChild($text); 
$item = $oXML->createElement("author"); 
$root->appendChild($item); 
$text = $oXML->createTextNode("пример"); 
$item->appendChild($text); 

$xsldoc  = new DOMDocument; 
$xsldoc->load('test.xsl'); 
$proc = new XSLTProcessor();  
$proc->importStyleSheet($xsldoc); 
header("Content-Type: text/html; charset=windows-1251"); // это чтобы бродилка поняла, что быдет кодировка win
echo $proc->transformToXML($oXML); 
?>

test.xsl
Код:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl<img src="images/smilies/redface.gif" border="0" alt="">utput method="html" encoding="windows-1251" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" doctype-system="http://www.w3.org/TR/html4/loose.dtd"/> 
<xsl:template match="/"> 

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"/> 
<title><xsl:value-of select="//title"/></title> 
</head> 

<body> 
<h1><xsl:value-of select="//title"/></h1> 
<h2><xsl:value-of select="//author"/> </h2> 
</body> 
</html> 

</xsl:template> 
</xsl:stylesheet>
 
Сверху