parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

XSL+DOM+import = проблема

527 04.08.2004 12:55

Здраствуйте!
Возникла такая вот проблема:
на страница собирается из разных кусков XML , у каждого куска есть свой XSL шаблончик. Когда собираю XML страницы, то делаю импорт xsl шаблонов всех кусков в XSL шаблон страницы. Делаю это с помощью DOM.
но вот проблема не хочет чего-то работать нормально XSL шаблон страницы, т.е. отображает все так как будто, нет там вапще ни одной xsl:import !!!

Но если руками прописать тот же xsl:import, то всё начинает шуршать как надо. Вчем ошибаюсь я?
--------------------------
файл index.html
--------------------------
@main[]
$path[/import/]
# входной xdoc документ 
$sourceDoc[^xdoc::load[${path}xml.xml]] 

# шаблон в который бум делать импорт
$template[^xdoc::load[${path}xsl1.xsl]]
# с помощью DOM делаем import xsl шаблонов 
# определяем пространство имен....
$template.search-namespaces.xsl[http://www.w3.org/1999/XSL/Transform]
# берем корневой элемент шаблона.
$xsl_stylesheet[^template.selectSingle[//xsl:stylesheet]]
# 		создаем элемент <xsl:import/>
		$xsl_import[^template.createElementNS[xsl;xsl:import]]
# 		добавляем атрибут href
		$attr[^xsl_import.setAttribute[href;xsl2.xsl]]
# 		добавляем созданый елемент <xsl:import/> к <xsl:stylesheet/> в начало дерева!!! важно!
		$add[^xsl_stylesheet.insertBefore[$xsl_import;$xsl_stylesheet.firstChild]]
# преобразование xdoc документа шаблоном item.xsl 
$transformedDoc[^sourceDoc.transform[$template]] 
# выдача результата
$response:content-type[
^if(def $form:mode){
	$.value[text/xml]
}{
	$.value[text/html]
}
        $.charset[$response:charset]
]
#####
^if(def $form:mode){
	^switch[$form:mode]{
		^case[xml]{$result[^sourceDoc.string[]]}
		^case[xsl]{$result[^template.string[]]}
	}
}{
	$result[^transformedDoc.string[$.method[html]]]
}
----------------------------
файл xml.xml
---------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xml>
	<window_name>Parser RU!</window_name>
	<linesMenu >
		<line name="classic" id="150" url="/cla/"/>
		<line name="dia" id="151" url="/dia/"/>
		<line name="abt" id="152" url="/ab/"/>
		<line name="mini" id="153" url="/mini/"/>
		<line name="sport" id="154" url="/sport/"/>
	</linesMenu>
</xml>
---------------------
файл xsl1.xsl с шаблоном в который импорт делаем
----------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<!--<xsl:import href="xsl2.xsl"/>-->
<xsl:template match="/">
	<title>
		<xsl:value-of select=".//window_name"/>
	</title>
<xsl:apply-templates select=".//linesMenu"/>
</xsl:template>
</xsl:stylesheet>
----------------------------
тот xsl что импортируем xsl2.xsl
----------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

<xsl:template match="linesMenu">
<table width="100%" cellpadding="0" cellspacing="0" border="0">
	<tbody>
		<xsl:for-each select="./line">
		<xsl:param name="url"><xsl:value-of select="@url"/></xsl:param>
		<tr>
			<td align="left"><a href="{$url}"><nobr><xsl:value-of select="@name"/></nobr></a></td>
		</tr>
		</xsl:for-each>
	</tbody>
</table>
</xsl:template>

</xsl:stylesheet>
чтобы посмотреть xsl : /import/?mode=xsl
чтобы посмотреть xml : /import/?mode=xml
чтобы посмотреть html : /import/

Какие есть еще способы что бы делать импорт автоматом кроме DOM?

Parser 3.1.2 CGI+XML; winXP; Apache 2