如何使用XSL转换创建嵌套列表

时间:2016-08-30 08:48:44

标签: html xml xslt

我想为以下转换创建一个XSL文件。

我有这个XML文件

<nodes>
  <node url='url1' title='url1'>
    <node url='url11' title='url11'>
      <node url='url111' title='url111'/>
    </node>
    <node url='url11' title='url11'/>
    <node url='url12' title='url12'/>
    <node url='url13' title='url13'>
      <node url='url131' title='url131'/>
      <node url='url132' title='url132'/>
    </node>
  </node>
</node>
<node>
  <node url='url2' title='url2'>
    <node url='url21' title='url21'/></node>
</nodes>

假设选择了url131,我想创建这个HTML段

<ul>
  <li class='active'><a href='url1'>url1</a>
    <ul>
      <li><a href='url11'>url11</a></li>
      <li><a href='url12'>url12</a></li>
      <li class='active'><a href='url13'>url13</a>
        <ul>
          <li><span>url131</span></li>
          <li><a href='url132'>url132<a></li>
        </ul>
      </li>
    </li>
  <li><a href='url2'>url2</a><li>
</ul>

单词:所选元素应创建为span。 所有父母都应标记为li.active。 所选元素及其父母的所有兄弟都没有标记。 一切都应该嵌套。

在模板中我想使用param $ self(可以从外部设置) 并为所选网址应用模板:

<template match="nodes">
<xsl:param name='self'>url131</xsl:param>
<xsl:apply-template select="node()[@url=$self]</xsl:apply-template>
</template>

模板节点必须处理3个案例,用SPAN或ANCORS创建LI,有或没有class .active。

<xls:template match="node">
<!-- todo: choose ... -->
</xsl:template>

但是有一个棘手的部分(对我来说):我需要某种递归,在树上倒退。

//节点[@ URL =自我] /../。为父母和//node[@url=self]/../../。对于祖父母来说,对于他们的前后兄弟姐妹也一样。

或者我应该计算祖先并将此数字用作等级参数。但据我所知,vars和params不能用于选择。

1 个答案:

答案 0 :(得分:0)

  

在模板中我想使用param $ self(可以从中设置)   外)

如果“来自外部”是指来自样式表的外部,那是不可能的。只有全局(顶级)参数可以在运行时传递给样式表。

考虑以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" indent="yes"/>

<xsl:param name="selected-node-url">url142</xsl:param>

<xsl:template match="nodes">
    <ul>
        <xsl:apply-templates select="node"/>
    </ul>
</xsl:template>

<xsl:template match="node">
     <li>
        <xsl:if test="descendant::node/@url=$selected-node-url">
            <xsl:attribute name="class">active</xsl:attribute>
        </xsl:if>
        <xsl:choose>
            <xsl:when test="@url=$selected-node-url">
                <span><xsl:value-of select="@url"/></span>
            </xsl:when>
            <xsl:otherwise>
                <a href="{@url}"><xsl:value-of select="@url"/></a>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:if test="node">
            <ul>
                <xsl:apply-templates select="node"/>
            </ul>
        </xsl:if>
     </li>
</xsl:template>

</xsl:stylesheet>

应用于以下格式正确的输入时:

<强> XML

<nodes>
  <node url="url1" title="url1">
    <node url="url11" title="url11">
      <node url="url111" title="url111"/>
    </node>
    <node url="url12" title="url12"/>
    <node url="url13" title="url13"/>
    <node url="url14" title="url14">
      <node url="url141" title="url141"/>
      <node url="url142" title="url142"/>
    </node>
  </node>
  <node url="url2" title="url2">
    <node url="url21" title="url21"/>
  </node>
</nodes>

结果将是:

<ul>
   <li class="active"><a href="url1">url1</a><ul>
         <li><a href="url1">url11</a><ul>
               <li><a href="url1">url111</a></li>
            </ul>
         </li>
         <li><a href="url1">url12</a></li>
         <li><a href="url1">url13</a></li>
         <li class="active"><a href="url1">url14</a><ul>
               <li><a href="url1">url141</a></li>
               <li><span>url142</span></li>
            </ul>
         </li>
      </ul>
   </li>
   <li><a href="url1">url2</a><ul>
         <li><a href="url1">url21</a></li>
      </ul>
   </li>
</ul>