【发布时间】:2011-08-05 12:37:11
【问题描述】:
我遇到了 XSLT 问题。我在<source> 中有一组兄弟节点(<level>),我想将其转换为节点的叠层(即每个级别都将呈现在其前一个兄弟节点中)。
XML 输入
<?xml version="1.0"?>
<sources>
<source mode="manual" name="test1">
<level>blablabla Level1</level>
<level>this is the second level</level>
<level>this is the third level</level>
</source>
</sources>
预期输出
我想要的输出是这个的叠印 html 版本(删节,叠印就是这里的东西):
<form class="source manual">
source > <input value="test1" name="sourceName" type="text">
<!-- LEVEL #1 -->
<p class="deepnessIndicator">Deepness: <strong>1</strong></p>
<div class="deepnessContainer">
<!-- LEVEL #2 -->
next-level:
<p class="deepnessIndicator">Deepness: <strong>2</strong></p>
<div class="deepnessContainer">
<!-- LEVEL #3 -->
next-level:
<p class="deepnessIndicator">Deepness: <strong>3</strong></p>
</div>
</div>
</form>
不幸的是我编写的 XSL 失败了,这里是源代码(我试图缩短但是):
XSL
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="sources">
<xsl:apply-templates select="*" />
</xsl:template>
<!-- Main template here -->
<xsl:template match="source[@mode='manual']">
<form class="source manual">
source > <input type="text" name="sourceName" value="{@name}" />
<!-- Here's what I call first the recursion
the parameter is the # of the <level>
that should be processed -->
<xsl:call-template name="sourceLevelRecursion">
<xsl:with-param name="currentLevel">1</xsl:with-param>
</xsl:call-template>
</form>
</xsl:template>
<!-- Recursion template -->
<xsl:template name="sourceLevelRecursion">
<xsl:param name="currentLevel" />
<!-- this apply-templates should apply on only
one node because of the selector but it won't -->
<xsl:apply-templates mode="deepnessHeader" select="./level[$currentLevel]">
<xsl:with-param name="currentLevel"><xsl:value-of select="$currentLevel" /></xsl:with-param>
</xsl:apply-templates>
<xsl:if test="level[$currentLevel+1]">
<div class="deepnessContainer">
<!-- Recursion Call here -->
<xsl:call-template name="sourceLevelRecursion">
<xsl:with-param name="currentLevel"><xsl:value-of select="$currentLevel+1" /></xsl:with-param>
</xsl:call-template>
</div>
</xsl:if>
</xsl:template>
<xsl:template mode="deepnessHeader" match="level">
<xsl:param name="currentLevel" />
<p class="deepnessIndicator">Deepness: <strong><xsl:value-of select="$currentLevel" /></strong></p>
</xsl:template>
<xsl:template match="text()" />
不幸的输出
我得到的最终错误输出是:
<form class="source manual">
source > <input value="test1" name="sourceName" type="text">
<p class="deepnessIndicator">Deepness: <strong>1</strong></p>
<p class="deepnessIndicator">Deepness: <strong>1</strong></p>
<p class="deepnessIndicator">Deepness: <strong>1</strong></p>
<div class="deepnessContainer">
next-level:
<p class="deepnessIndicator">Deepness: <strong>2</strong></p>
<p class="deepnessIndicator">Deepness: <strong>2</strong></p>
<p class="deepnessIndicator">Deepness: <strong>2</strong></p>
<div class="deepnessContainer">
next-level:
<p class="deepnessIndicator">Deepness: <strong>3</strong></p>
<p class="deepnessIndicator">Deepness: <strong>3</strong></p>
<p class="deepnessIndicator">Deepness: <strong>3</strong></p>
</div>
</div>
</form>
如您所见,应用:
<xsl:apply-templates mode="deepnessHeader" select="./level[$currentLevel]">
匹配
<xsl:template mode="deepnessHeader" match="level">
匹配三次,源 XML 中每个 <level> 匹配一次。但是,apply-templates 中的选择器应该只选择一个节点不是吗?
【问题讨论】:
-
PS:我用这个运行了我的 XSLT 测试:xslttest.appspot.com
-
好问题,+1。请参阅我的答案以获得完整且简单的解决方案以及此问题原因的解释。
标签: xslt