У меня проблемы с XSLT.У меня есть набор одноуровневых узлов (<level>
) внутри <source>
, которые я хотел бы преобразовать в набор узлов (т. Е. Каждый уровень будет отображаться внутри своего предыдущего одноуровневого элемента).
XML INPUT
<?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">
, сопоставляется трижды, один раз за каждый <level>
в исходном XML.Но селектор в apply-templates должен выбирать только один узел, не так ли?