Изменение пройденной части документа /XSLT/

algo

To the stars!
Изменение пройденной части документа /XSLT/

XSL-шаблон состоит из состоит из нескольких xsl-файлов. Один из них <head>, другой <body>, третий - навигация..

Но иногда, например, при обработке body требуется вставить визуальный редактор. А это, по правилам HTML, требует правки head на предмет css.

Каким образом организовать такую правку, находясь внутри body?

При этом подразумевается, что head-часть понятия не имеет о том, что кто-то куда-то собирается добавлять новые теги.

Другие варианты правки:

- добавить атрибут onLoad к тэгу body из подключаемого шаблона навигации из внутреннего стайлшита.
- изменить title
.. ?

Может быть, какой-то вариант двупроходной обработки? Или EXSLT может как-то помочь?


P.S PHP5.1, соответственно xslt 1.0 (libxslt 1.1.14)
 

inTox

вёбных дел мастер
algo, ты можешь легко и непринужденно переопределить шаблоны обработки head в body. Можешь использовать атрибут "mode" с if\choose. но лучше и быстрее будет использовать контекстный селектор:

<template match="root[@mode='editable']">
одно
</template>

<template match="root">
другое
</template>
 

algo

To the stars!
Спасибо, мне подсказали другое, великолепное решение проблемы через apply-imports ;)
 

inTox

вёбных дел мастер
и каким образом ты выбираешь шаблон? =)
 

algo

To the stars!
Я щас не дома, приблизительно такое.

=============================
global.xsl
---------------
xsl:import header.xsl
xsl:import nav.xsl

<xsl:template match="head">
global
<xsl:apply-imports/>
</xsl:template>

header.xsl
-------------
<xsl:template match="head">
<head>
basic header
</head>
</xsl:template>

nav.xsl
-------------
<xsl:template match="head">
navigation CSS
<xsl:apply-imports/>
</xsl:template>

=====================================
Дерево импортов:
-global
--header
--nav

Порядок обхода
header->nav->global
Приоритет шаблонов
global->nav->header

В этих примерах каждый шаблон после того, как что-то сделает сам, передает управление следующему по приоритету через <xsl:apply-imports/>. header.xsl не передает, т.к предполагается что он базовый и принимает все результаты, завертывая их в <head>.

Вообще из документации не очевидно, что <xsl:apply-imports/> работает со ВСЕМ деревом импорта, а не с той веткой, которая идет от данного (под)шаблона.

На текущий момент остаются две проблемы.

1)

При таком решении исходный XML должен содержать узел head. Конкретно с head все довольно удобно, т.к туда естественным образом попадают всякие <title> из движка и META-теги.

Но что, если я хочу изменить какую-нибудь <form> глобального значения? Т.е таг, который есть в шаблоне верхнего уровня, но его нельзя match, т.к он только в XSL.

Впрочем, пока что неясен конкретный пример, где это понадобится..

2)

XSL могут дописывать один за другим, но как переопределить, скажем, <body onload> из global.xsl, если он задается в header.xsl ?
Например, я хочу добавить в атрибут body onload свою функцию инициализации к уже существующим - это потребует изменения атрибута...

-~{}~ 10.09.05 01:16:

inTox - а как ты предложил бы решить, можно твое решение подробнее ? Где что переопределять..
 
Сверху