我在XSL中有两个模板,我想在一个XSL文件中执行它们。原始xml
<root>
<step1.alfa/>
<step1.bravo/>
<step1.charlie/>
<step1.delta/>
<step2.alfa/>
<step2.bravo/>
<step2.charlie/>
<step2.delta/>
需要嵌套,然后重命名元素名称。但我不知道如何在一个xslt中实现这两个模板。因为模板总是从原始的xml开始。
第一个输出
<root>
<step>
<step1.alfa/>
<step1.bravo/>
<step1.charlie/>
<step1.delta/>
</step>
<step>
<step2.alfa/>
<step2.bravo/>
<step2.charlie/>
<step2.delta/>
</step>
第二输出<root>
<step>
<alfa/>
<bravo/>
<charlie/>
<delta/>
</step>
<step>
<alfa/>
<bravo/>
<charlie/>
<delta/>
</step>
第一个模板用于嵌套步骤,第二个模板用于重命名步骤。我只展示了一个,但是我为每个需要重命名的元素都准备了一个模板。
<xsl:template match="Values" name="recursive-steps">
<xsl:param name="var" select="2"/>
<xsl:choose>
<xsl:when test="$var > 0">
<STEP>
<xsl:for-each select="node()[starts-with(name(), concat('step', $var))]">
<xsl:copy-of select="."/>
</xsl:for-each>
</STEP>
<xsl:call-template name="recursive-steps">
<xsl:with-param name="var" select="$var - 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:template>
<xsl:template match="*[substring(name(), string-length(name())-3) = 'alfa']">
<ALFA>
<xsl:apply-templates select="@*|node()" />
</ALFA>
</xsl:template>
添加我想要合并的两个模板
一般来说,您将模板应用于前一个模板的结果的方式是通过在变量中捕获结果:
<xsl:variable name="temp">
<xsl:apply-templates select="x" mode="phase-1"/>
</xsl:variable>
<xsl:apply-templates select="$temp" mode="phase-2"/>
但是因为变量是结果树片段,所以在XSLT 1.0中必须使用exslt:node-set()扩展来绕过rtf的限制:
<xsl:apply-templates select="exslt:node-set($temp)" mode="phase-2"/>
如果你想让第二个模板在第一个模板之后应用,你应该改变这部分:
<xsl:for-each select="node()[starts-with(name(), concat('step', $var))]">
<xsl:copy-of select="."/>
</xsl:for-each>
:
<xsl:apply-templates select="node()[starts-with(name(), concat('step', $var))]"/>
或者说:
<xsl:apply-templates select="*[starts-with(name(), concat('step', $var, '.'))]"/>
但是,第二个模板没有多大意义。我认为应该是这样的:
<xsl:template match="*">
<xsl:element name="{substring-after(name(), '.')}"/>
</xsl:template>
坦率地说,你的第一个模板也有点尴尬-我建议你在这个任务中查看Muenchian分组