我使用一个极简主义的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)
它代表以下结构:
如何使用XSLT将此平面XML列表转换为嵌套HTML列表?
PS:这是MySQL中管理分层数据的示例树.
这种形式的平面列表很难在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
| 归档时间: |
|
| 查看次数: |
7796 次 |
| 最近记录: |