我想在HTML文档的顶部创建一个用于创建目录的模板,我希望能够单击此表中的每个项目以获取有关它的更多详细信息,也就是说,它跳转到文档中更下面的相应详细部分。
类似:
目录:
Node1(单击此按钮将转到下面的粗体Node1)
Node2
节点3
其他东西......
Node1
描述:blah
内容:1.55
版本:1.55
粗糙的XSLT代码:
// create table of contents
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">Name</th>
</tr>
<xsl:for-each select="">
<xsl:apply-templates select="my_node"/>
</xsl:for-each>
// do other stuff
// create detailed view (code omitted because I don't know how yet)
// template for node
<xsl:template match="my_node">
<tr>
<td><xsl:value-of select="../@name"/></td>
</tr>
</xsl:template>
我的问题是我想要处理这个节点两次但在我的代码中的不同位置,一个我只是抓住名字,一个我抓住它的所有信息。据我了解,每个节点都有一个模板是XSLT中的首选实践。我怎样才能实现我在这里描述的内容?
我是否通过一个布尔参数的类型来确定在模板中采取哪种操作?或者为父节点编写模板并在第一种情况下遍历到名称?我不确定我喜欢其中任何一个。
答案 0 :(得分:1)
使用 modes 。大致是:
<xsl:template match="/">
<!-- create table of contents -->
<table border="1">
<tr bgcolor="#9acd32">
<th style="text-align:left">Name</th>
</tr>
<xsl:apply-templates select="my_node" mode="toc"/>
</table>
<!-- do other stuff -->
<!-- create detailed view -->
<h1>Details</h1>
<xsl:apply-templates select="my_node"/>
</xsl:template>
<xsl:template match="my_node" mode="toc">
<tr>
<td><xsl:value-of select="../@name"/></td>
</tr>
</xsl:template>
<xsl:template match="my_node">
<!-- whatever is required for detailed view -->
</xsl:template>
P.S。将xsl:for-each
与xsl:apply templates
混合时要小心。在大多数情况下,您希望使用其中一种。