обработка 2х xml документов

  • Автор темы Igor Ageyev
  • Дата начала

Igor Ageyev

Guest
обработка 2х xml документов

В xsl я полный ламер.

Кто нибудь может показать простенький пример трансформации нескольких xml документом одним xsl файлом сразу.

Вроде должен использоваться document(). Но как? Не могу сообразить:(
 

slach

Новичок
читай
http://zvon.org/xxl/XSLTreference/Output/index.html

обучайся
PHP:
/*
 1.xml
*/
<?xml version="1.0"?>
<root>
 <tag1>tag1 in 1.XML</tag1>
</root>

/*
2.xml
*/
<?xml version="1.0"?>
<root>
 <tag2>tag2 in 2.XML</tag2>
</root>

/*---------------------------
style.xsl
---------------------------*/
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="windows-1251" method="txt"/>

<xsl:template name="main" match="/">
 start main template

  <xsl:call-template name="show_tag">
   <xsl:with-param name="tag_value" select="document('1.xml')/root/tag1"/>
  </xsl:call-template>


  <xsl:call-template name="show_tag">
   <xsl:with-param name="tag_value" select="document('2.xml')/root/tag2"/>
  </xsl:call-template>
 end main template
</xsl:template>

<xsl:template name="show_tag">
<xsl:param name="tag_value"/>

 <xsl:value-of select="$tag_value"/>


</xsl:template>

</xsl:stylesheet>
 

Igor Ageyev

Guest
Большое спасибо.
Пример того, что у меня в итоге получилось, привожу ниже.

Правда, возникла еще пара вопросов;)
Нельзя ли упростить вызов шаблона в файле content.xsl? (выделено красным)

Почему конструкция не работает, если в файле content.xsl вместо include использовать import? (выделено синим)

Код:
----------menu.xml-----------

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="menu.xsl"?>

<source>
	<item id="test1" name="first test" />
	<item id="test2" name="second test" />
	<item id="test3" name="third test" />
</source>

----------content.xml-----------

<?xml version="1.0" encoding="windows-1251"?>
<?xml-stylesheet type="text/xsl" href="content.xsl"?>
<source>
	<title>Test</title> 
	<content>Hello world!!!</content>
</source>

----------content.xsl-----------

<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method="html" encoding="windows-1251" indent="no"/>

<xsl:[COLOR=blue][B]include[/B][/COLOR] href="menu.xsl"/>
<xsl:template match="/">
	
	[COLOR=red][B]<xsl:call-template name="menu"> 
		<xsl:with-param name="tag_value" select="document('menu.xml')/source/item"/>
	</xsl:call-template>[/B][/COLOR] 
	<h2><xsl:value-of select="source/title"/></h2>
	<xsl:value-of select="source/content"/>

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

----------menu.xsl-----------

<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 name="menu">

	<xsl:param name="tag_value"/>
	<xsl:for-each select="$tag_value">
		<a href="index.php?id={@id}"><xsl:value-of select="@name"/></a>
		<xsl:if test="not(position()=last())"> | </xsl:if> 
	</xsl:for-each>

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

-----------------------------
 

Orlis

Guest
<xsl:eek:utput method="html" encoding="windows-1251" indent="no"/> следует указывать один и только один раз

вместо красного лучше написать так:
<xsl:apply-templates select="document('menu.xml')/source"/>

а в menu.xsl:

Код:
<xsl:template match="source">
<xsl:for-each select="item">
	<a href="index.php?id={@id}"><xsl:value-of select="@name"/></a>
	<xsl:if test="not(position()=last())"> | </xsl:if>
</xsl:for-each>
</xsl:template>
 

Igor Ageyev

Guest
Спасибо за поправки.

вместо красного лучше написать так:
<xsl:apply-templates select="document('menu.xml')/source"/>
Извиняюсь за возможно глупый вопрос;)
А как будут обстоять дела, если понадобиться еще один шаблон приинклудить (к примеру с обработкой новостей)?

Мне просто не совсем понятно, как xsl-обработчик будет отличать, когда под apply-templates нужно применить шаблон из файла menu.xsl , а когда, допустим, из news.xsl ?

Если размышлять логично, то в случае с именованными шаблонами проблем не должно быть. Но в спецификации не сказано, что apply-templates содержит атрибут name.
 
Сверху