簡體   English   中英

XSLT 1.0將模板應用於另一個模板的結果

[英]XSLT 1.0 apply template on result of another template

我想在一個XSL文件中執行XSL中的2個模板。 原始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分組以完成此任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM