XSLT 1.0在另一个模板的结果上应用模板



我在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分组

相关内容

  • 没有找到相关文章

最新更新