2016-08-25 86 views
0

我在XSL中有2個模板,我想在單個XSL文件中執行。 原始的XMLXSLT 1.0在另一個模板的結果上應用模板

<root> 
    <step1.alfa/> 
    <step1.bravo/> 
    <step1.charlie/> 
    <step1.delta/> 
    <step2.alfa/> 
    <step2.bravo/> 
    <step2.charlie/> 
    <step2.delta/> 

這需要嵌套,然後重命名的元素名稱。 但我無法弄清楚如何在1個單獨的xslt中完成這2個模板。由於模板始終從原始的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> 

在這裏添加了我想合併的2個模板。

+0

爲什麼你不讓我們更容易,併發布你有兩個模板。特別是因爲不清楚可以有多少步驟。 –

+0

@ michael.hor257k添加了它們,底部有兩個我想合併的模板。目前我正在嘗試使用xsl,如果在第一個模板的循環中。 –

回答

0

一般的方法是在變量捕獲結果:

<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"/> 
+0

「*一般來說,您應用的方式 - 將模板應用於之前模板的結果是將結果捕獲到一個變量*」只有當兩個模板匹配相同的節點時纔有必要 - 在這裏完全沒有這種情況。 –

+0

我正在回答帖子標題中的問題,但同意,仔細閱讀,標題與實際描述的問題關係不大。 –

0

好吧,如果你想在第一後應用第二個模板,你應該改變這種部分:

<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 grouping這項任務。應用模板到以前的模板的結果

+0

我對XSL非常新穎,從昨天開始我幾乎瞭解到現在所知道的一切。我已經看過Muenchian分組方法,但似乎只能對值進行排序,而不是對元素名稱本身進行排序?或者我理解錯了,是否必須再看一遍? –

+0

@Pieter_mov你的理解是錯誤的。將鍵定義爲''並繼續。 –

相關問題