libxml и koi8-r

Hoot

Guest
libxml и koi8-r

Делаю следующее
PHP:
$xml = new DOMDocument();
$xml->loadxml( $xml_doc);
  
$xsl = new DomDocument;
$xsl->load( "file.xsl" );

$proc = new xsltprocessor;
$proc->importStyleSheet($xsl);
стиль в кодировке koi8-r и содержит русские символы

<?xml version="1.0" encoding="koi8-r"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:eek:utput method="html" encoding="koi8-r"/>
...

importStyleSheet ругается на русские символы в стиле.

Если стиль сохранить в windows-1251 и поменять заголовки, то выдается сообщение о неизвестной кодировке.


PHP 5.0.2, адмны говорят, что libxml собран с iconv.
 

crocodile2u

http://vbolshov.org.ru
Насколько мне известно, DOM functions в PHP не работают с русскими кодировками. Пиши в UTF-8.

PS: я могу ошибаться, пусть меня в таком случае поправят спецы

PPS: когда мне надо было с помощью XML-XSL выводить русский текст, я его конвертил в UTF-8.
 

Hoot

Guest
Сделал так:
PHP:
$xsl = new DomDocument;
$xsl->loadxml( iconv("KOI8-R","UTF-8",file_get_contents("style.xsl")));

$proc = new xsltprocessor;
$proc->importStyleSheet($xsl);
Ругается в строчке $proc->importStyleSheet($xsl); - Invalid expression на русские символы.

Что я делаю не так?
 

Profic

just Profic (PHP5 BetaTeam)
crocodile2u
В php5, как ext/dom, так и ext/xsl при нормальной сборке, с кодировками работают великолепно

Hoot
Спрашивай с админов...

Начальная декларация xml-документа специально вынесена из блока раскраски, чтобы все остальное раскрасилось :)

php5.xslt-cp1251.xml:
<?xml version="1.0" encoding="windows-1251" ?>
PHP:
<collection>
 <cd>
  <title>PHP рулит</title>
  <artist>Иванов/Петров/Сидоров типа программеры</artist>
  <year>2003</year>
 </cd>
 <cd>
  <title>Крещение огнём</title>
  <artist>Ария</artist>
  <year>2004</year>
 </cd>
</collection>
php5.xslt-cp1251.xsl:
<?xml version="1.0" encoding="windows-1251" ?>
PHP:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="html" encoding="windows-1251" indent="no"/>
 <xsl:template match="collection">
  Привет! Добро пожаловать в мою скромную коллекцию CD!
  <xsl:apply-templates/>
 </xsl:template>
 <xsl:template match="cd">
  <h1><xsl:value-of select="title"/></h1>
  Автор: <h2><xsl:value-of select="artist"/></h2>
  Год: <h3><xsl:value-of select="year"/></h3>
 </xsl:template>
</xsl:stylesheet>
php5.xslt-cp1251.php:
PHP:
<?php
/* Load the two XML sources */
$xml = new DomDocument; // from /ext/dom
$xml->load('php5.xslt-cp1251.xml');

$xsl = new DomDocument;
$xsl->load('php5.xslt-cp1251.xsl');

/* Configure the transformer */
$proc = new xsltProcessor;
$proc->importStyleSheet($xsl); // attach the xsl rules
echo $proc->transformToXML($xml); // actual transformation
?>
E:\000>php php5.xslt-cp1251.php

Привет! Добро пожаловать в мою скромную коллекцию CD!

<h1>PHP рулит</h1>
Автор: <h2>Иванов/Петров/Сидоров типа программеры</h2>
Год: <h3>2003</h3>
<h1>Крещение огнём</h1>
Автор: <h2>Ария</h2>
Год: <h3>2004</h3>


E:\000>
 

crocodile2u

http://vbolshov.org.ru
Охх.... Точно, работает... Почему ж я так через ж... делал? А в php5.0.0 не было глюков? Я просто на нем тогда работал, и больше с XML-XSL не соприкасался... И уж точно не просто так я стал конвертить контент с помощью iconv(); Хотя сейчас не могу точно сказать - может и сам накосячил.
 

Profic

just Profic (PHP5 BetaTeam)
Насколько мне известно - нет. Единственное, что DOM не поддерживает - это указание кодировки при создании документа с нуля - приходится "извращаться" через создание из строки с xml-декларацией и корневым узлом.
 

crocodile2u

http://vbolshov.org.ru
Вот кстати в связи с этим:

твой пример работает великолепно, но я скейчас стал смотреть, а почему же я тогда все русские данные конвертил в ЮТФ-8, и мои эксперименты/переделки закончились следующим:

я создаю ДОМДокумент, загружаю в него фактически пустой XML - с указанием кодировки windows-1251.

Потом в документЭлемент добавляются узлы с данными в 1251. Никакой ругани, все вроде бы отлично. Документ собран, но на saveXML() ругается:

output conversion failed due to conv error in index.php on line XXX

-~{}~ 03.11.04 19:04:

Прошу прщения: точный текст error message:

Warning: output conversion failed due to conv error in /usr/local/apache/htdocs/lomilom/index.php on line 217

Warning: Bytes: 0xCA 0xE0 0xEB 0xE5 in /usr/local/apache/htdocs/lomilom/index.php on line 217

-~{}~ 03.11.04 19:18:

Обязательно в самое ближайшее время (видимо, завтра) постараюсь привести минимальный код, вызывающий проблему. Что-то мне не нравится эта постоянная перекодировка данных....
 

Hoot

Guest
Я нашел у себя проблему, осталось только найти решение :)

$proc->importStyleSheet($xsl); ругается только тогда, когд в Xpath выражениях встречаются русские символы (<xsl:value-of select="заголовок"/>).


При этом русские тэги в XML документе переваривает на ура...


Где рыть или так и должно быть?
 

chameleon

Новичок
ругается только тогда, когд в Xpath выражениях встречаются русские символы (<xsl:value-of select="заголовок"/> ).
имхо, в атрибутах non-Latin-1 символы ескейпятся -> все твои Xpath уже не Xpath ;)..
и вообще если есть возможность, то работай в UTF-8 и забудь про такие проблемы.
 
Сверху