我想为以下转换创建一个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不能用于选择。
答案 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>