XSLT-проблемы

indent

Новичок
XSLT-проблемы

Хочу задать несколько вопросов знающим людям по поводу XSLT-преобразований (PHP5)

1. Как сделать, чтобы работал indent="yes"? На выходе получается код в одну большую строку. И без разницы, есть ли indent="yes" или нет. Я что только ни делал, и регулировал DOMDocument->preserveWhiteSpaces, думая, что может XSLT отдается код, отпарсенный без разделителей, и применял <xsl:eek:utput preserve-spaces />, но ничего не помогает. Причем иногда код получается одна-большая-строка + кусок отформатированного кода + одна-большая-строка. Ну и т.д. Не критично это, конечно, но осадок остается :) В какую сторону смотреть?
2. Откуда могут появляться лишние xmlns=""? Даже идейно не представляю. Опять же, куда двигаться в решении?
3. В ситуации
xslt1:
Код:
<xsl:output ... xmlns:php="http://php.net/xsl" ... />
...
<xsl:value-of select="php:function(...)" />
...
xslt2:
Код:
<xsl:output ... !нет xmlns:php! ... />
<xsl:import href="xsl1" />
...!нет php:function!...
xml + xslt1 дают нормальную работу, а вот xml + xslt2 ругается на то, что дескать непонятно, что такое php:function. Но ведь что такое php:function я определил для xslt1 в output, а в xslt2 мне его вроде бы и не надо определять, потому что я его и не использую нигде в коде xslt2. Или же такое поведение нормально и мне надо будет определять php:xsl не только в "импортном" файле, где он и используется, но и в каждом из тех, куда он импортируется?
 

ViJu

Новичок
Re: XSLT-проблемы

xml + xslt2 ругается на то, что дескать непонятно ...
а откуда ему будет понятно, что значан эти php:function?
для этого и существуют namespaces

чтобы не появлялись xmlns="" не забудь указывать везде (главной и импортируемых) в xslt
namespaces для элементов без префикса xmlns="http://www.w3.org/1999/xhtml"

-~{}~ 23.03.06 09:19:

это было про 3 и 2
хотя стой

Или же такое поведение нормально и мне надо будет определять php:xsl не только в "импортном" файле, где он и используется, но и в каждом из тех, куда он импортируется?
нет не надо, значит ...!есть php:function!...

теперь про 1:
$data->normalize();
$data->preserveWhiteSpace = false;
$data->formatOutput = true;
 

indent

Новичок
Сложно все это, сложно. xmlns="http://www.w3.org/1999/xhtml" в stylesheet указан везде, кроме этого указан xmlns="http://www.w3.org/1999/xhtml" для html-элемента (на всякий), но нет. Причем особенность такая, что xmlns="" появляется только когда делаю <xsl:copy-of />, а в остальных случаях почему-то нормально.

Далее. С indent'ом я сделал как ты говорил, но опять же результата ноль. Хотя когда я экспериментировал с пустыми xmlns и попробовал убрать xmlns="http://www.w3.org/1999/xhtml" и у html, и у <xsl:stylesheet />, то появилось форматирование (не стройное, но хоть какое-то), но вот пустые теги он закрывать перестал... Что за чудеса? Почему xslt-процессор делает какие-то автоматические преобразования, меня не спросясь, причем это не документировано (я по крайней мере не встречал документов, которые ему предписывают это делать или хотя бы предупреждают, что он может это делать)?

3. php:function у меня находится только в одной таблице и в ней есть xmlns:php, но когда эту таблицу импортирую в другую, где НЕТ ни следа применения php:function, то он все равно требует наличия xmlns:php и в той таблице, куда импортирую.

---

Я вот что хочу понять. Где зарыта собака и кто из нас не прав: я или процессор. Если я, то я хочу понять, почему процессор делает то или иное действие. Потому что волшебные решения типа добавить сюда то-то или убрать отсюда то-то могут работать, но еще и хочется знать, почему они работают, чтобы не доставать потом вас вот такими непонятками.
 

glider

Guest
indent
Сложно все это, сложно. xmlns="http://www.w3.org/1999/xhtml" в stylesheet указан везде, кроме этого указан xmlns="http://www.w3.org/1999/xhtml" для html-элемента (на всякий), но нет. Причем особенность такая, что xmlns="" появляется только когда делаю <xsl:copy-of />, а в остальных случаях почему-то нормально.
Вроде правильно процессор делает...
Если <xsl:copy-of />, то он копирует указанную ноду со всеми потрохами, включая объявление NS. Если же парсишь шаблоном - то шаблон отдает только то, что по нему на выходе получается. И объявление NS - только если об этом явно указано в получаемом на выходе шаблона XML.

indent
...
3. php:function у меня находится только в одной таблице и в ней есть xmlns:php, но когда эту таблицу импортирую в другую, где НЕТ ни следа применения php:function, то он все равно требует наличия xmlns:php и в той таблице, куда импортирую.
Попробуй указать xmlns:php конкретно в том тэге, где оно используется, в качестве его атрибута.
Может, при импорте объявления NS теряются?...
 

indent

Новичок
Ты прав, как только я начал указывать xmlns:php в теге, все прошло. Это глюк в процессоре или он должен забывать про xmlns:php после импорта? Может там есть некая система приоритетов, или еще что?

А вот что делать с автоматическими отступами и как убрать xmlns="" при copy-of -- понятия не имею.

-~{}~ 26.03.06 19:00:

И еще, как заставить процессор не заключать содержимое <script> в <![CDATA[ ]]> (метод вывода -- xml)
 

slach

Новичок
1) xmlns:php объявляется ВО ВСЕХ XSL документах
2) лишние namespace убираются через
<xsl:stylesheet ... exclude-result-prefixes="php">

3) заключать содержимое <script> в CDATA на выходе ИДЕОЛОГИЧЕСКИ ПРАВИЛЬНО =) с точки зрения XHTML
<xsl:eek:utput method="html"/> у тебя стоит?

4) насчет indent почитай гугль и спецификацию
http://www.google.com/search?q=libxslt+xsl+output+indent

http://mail.gnome.org/archives/xslt/2001-June/msg00034.html
 
Сверху