如何使用XSLT从平面XML列表构建树?

Pie*_*ing 6 xslt tree

我使用一个极简主义的MVC框架,其中PHP控制器DOM模型交给XSLT视图(参见okapi).

为了构建导航树,我在MYSQL中使用了嵌套集.这样,我最终得到了一个模型XML,如下所示:

<tree>
    <node>
        <name>root</name>
        <depth>0</depth>
    </node>
    <node>
        <name>TELEVISIONS</name>
        <depth>1</depth>
    </node>
    <node>
        <name>TUBE</name>
        <depth>2</depth>
    </node>
    <node>
        <name>LCD</name>
        <depth>2</depth>
    </node>
    <node>
        <name>PLASMA</name>
        <depth>2</depth>
    </node>
    <node>
        <name>PORTABLE ELECTRONICS</name>
        <depth>1</depth>
    </node>
    <node>
        <name>MP3 PLAYERS</name>
        <depth>2</depth>
    </node>
    <node>
        <name>FLASH</name>
        <depth>3</depth>
    </node>
    <node>
        <name>CD PLAYERS</name>
        <depth>2</depth>
    </node>
    <node>
        <name>2 WAY RADIOS</name>
        <depth>2</depth>
    </node>
</tree>
Run Code Online (Sandbox Code Playgroud)

它代表以下结构:

    • TELEVISIONS
      • 液晶显示
      • 等离子体
    • 便携式电子设备
      • MP3播放器
      • CD播放器
      • 2路无线电

如何使用XSLT将此平面XML列表转换为嵌套HTML列表?

PS:这是MySQL中管理分层数据的示例树.

Mar*_*ell 5

这种形式的平面列表很难在xslt中使用,因为你需要找到下一个分组的位置,等等.你能使用不同的xml吗?例如,使用平面xml:

<?xml version="1.0" encoding="utf-8" ?>
<tree>
  <node key="0">root</node>
  <node key="1" parent="0">TELEVISIONS</node>
  <node key="2" parent="1">TUBE</node>
  <node key="3" parent="1">LCD</node>
  <node key="4" parent="1">PLASMA</node>
  <node key="5" parent="0">PORTABLE ELECTRONICS</node>
  <node key="6" parent="5">MP3 PLAYERS</node>
  <node key="7" parent="6">FLASH</node>
  <node key="8" parent="5">CD PLAYERS</node>
  <node key="9" parent="5">2 WAY RADIOS</node>
</tree>
Run Code Online (Sandbox Code Playgroud)

这样做非常简单(非常有效):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:key name="nodeChildren" match="/tree/node" use="@parent"/>
  <xsl:template match="tree">
    <ul>
      <xsl:apply-templates select="node[not(@parent)]"/>
    </ul>
  </xsl:template>
  <xsl:template match="node">
    <li>
      <xsl:value-of select="."/>
      <ul>
        <xsl:apply-templates select="key('nodeChildren',@key)"/>
      </ul>
    </li>
  </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

这是一个选择吗?

当然,如果将xml构建为层次结构,则更容易;-p