parser

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

 

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

А сейчас позреют многие ...

Nexus 01.07.2002 17:59

Как прозрел и я.

Преобразование "плоского" XML в древовидный.
С помощью этого форум пишется раз-два.
И код в примере "пишем форум" сокращается до минимума.
Исходный XML :
<?xml version="1.0" encoding="windows-1251"?>
<collection>
	<item text="test5" id="5" pid="3"/>
	<item text="test1" id="1" pid="0"/>
	<item text="test2" id="2" pid="0"/>
	<item text="test3" id="3" pid="1"/>
	<item text="test4" id="4" pid="2"/>
</collection>
Наш XSL :
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="windows-1251"/>
	<xsl:param name="topid" select="0"/>

     <xsl:template match="collection">
     <test>
             <xsl:value-of select="."/>
             <xsl:apply-templates select="item[@pid=$topid]">
				<xsl:with-param name="x" select="1"/>
			 </xsl:apply-templates>
	</test>
     </xsl:template>

     <xsl:template match="item">
		<xsl:param name="x"/>
         <item id="{@id}" name="{@text}" pid="{@pid}" depth="{$x}">
            <xsl:apply-templates select="//item[@pid=current()/@id]">
				<xsl:with-param name="x" select="$x+1"/>
			</xsl:apply-templates>
         </item>

     </xsl:template>

</xsl:stylesheet>
Получаем :
  <?xml version="1.0" encoding="windows-1251" ?> 
 <test>
 <item id="1" name="test1" pid="0" depth="1">
        <item id="3" name="test3" pid="1" depth="2">
             <item id="5" name="test5" pid="3" depth="3" /> 
         </item>
  </item>
  <item id="2" name="test2" pid="0" depth="1">
         <item id="4" name="test4" pid="2" depth="2" /> 
  </item>
  </test>