2010-06-03 4 views
0

Je dois prendre ce xml ...Utilisez XSL pour transformer une liste XML dans un arbre 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> 

Et produire ce 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> 

Je reçois comment collecter les nœuds enfants et mis Je ne peux pas comprendre comment les ignorer alors en les considérant comme des parents si je les ai déjà utilisés comme enfants.

Répondre

0

testé ce qui suit, qui semble travailler

Appliquer tous les éléments à la racine avec parent_id = 0, puis récursive itérer pour les enfants ..

<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

Cette feuille de style:

<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> 

Sortie:

<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> 

Remarque: Touches pour les références croisées.

Questions connexes