2010-06-03 104 views
0

我需要借这个XML ...使用XSL转换XML列到XHTML树

<root> 
    <item id=’1’ parent_id=’0’>ONE</item> 
    <item id=’2’ parent_id=’1’>TWO</item> 
    <item id=’3’ parent_id=’1’>THREE</item> 
    <item id=’4’ parent_id=’2’>FOUR</item> 
    <item id=’5’ parent_id=’0’>FIVE</item> 
</root> 

而产生这种XHTML ...

<div class=’parent’>ONE</div> 
<div class=’child’> 
    <div class=’parent’>TWO</div> 
    <div class=’child’> 
     <div class=’parent’>FOUR</div> 
    </div> 
    <div class=’parent’>THREE</div> 
</div> 
<div class=’parent’>FIVE</div> 

我得到如何收集子节点,并把他们在他们的父母之下,但我无法理解如果我已经将他们当作孩子使用,那么他们就不能将他们视为父母。

回答

0

测试以下,这似乎工作

应用上的所有项目与PARENT_ID = 0的根,然后递归遍历,对子女..

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
    <xsl:apply-templates select="root/item[@parent_id='0']"/> 
</xsl:template> 


<xsl:template match="item"> 
    <div class="parent"><xsl:value-of select="."/></div> 
    <xsl:if test="count(../item[@parent_id=current()/@id]) != 0"> 
    <div class="child"> 
     <xsl:apply-templates select="../item[@parent_id=current()/@id]"/> 
    </div> 
    </xsl:if> 
</xsl:template> 
0

这个样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:key name="kItemById" match="item" use="@id"/> 
    <xsl:key name="kItemByParentId" match="item" use="@parent_id"/> 
    <xsl:template match="root"> 
     <xsl:apply-templates select="item[not(key('kItemById',@parent_id))]"/> 
    </xsl:template> 
    <xsl:template match="item"> 
     <xsl:variable name="vChild" select="key('kItemByParentId',@id)"/> 
     <div class="parent"> 
      <xsl:value-of select="."/> 
     </div> 
     <xsl:if test="$vChild"> 
      <div class="child"> 
       <xsl:apply-templates select="$vChild"/> 
      </div> 
     </xsl:if> 
    </xsl:template> 
</xsl:stylesheet> 

输出:

<div class="parent">ONE</div> 
<div class="child"> 
    <div class="parent">TWO</div> 
    <div class="child"> 
     <div class="parent">FOUR</div> 
    </div> 
    <div class="parent">THREE</div> 
</div> 
<div class="parent">FIVE</div> 

注意:交叉引用的键。