2016-08-25 7 views
0

XSLに1つのXSLファイルで実行する2つのテンプレートがあります。 元のXMLXSLT 1.0別のテンプレートの結果にテンプレートを適用する

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

これは、入れ子にして、要素名の名前を変更する必要があります。 しかし、私はどのようにこれらの2つのテンプレートを1つの単一の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> 

まずテンプレートが巣にステップであり、第二には、それらの名前を変更することです。私は1つしか表示しませんが、名前を変更する必要があるすべての要素のテンプレートがあります。

<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

あなたは私たちのためにそれを容易にし、あなたが持っている2つのテンプレートを投稿していないなぜあなたはEXSLTを使用する必要があります。特にいくつのステップがあるのか​​ははっきりしていないので、特にそうです。 –

+0

@ michael.hor257kそれらを追加しました。下部には、結合したい2つのテンプレートがあります。現在、私は最初のテンプレートのループ内にあれば、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で、結果ツリーフラグメントであるため、 RTFsの制限を回避するためにノードセット()拡張子:

<xsl:apply-templates select="exslt:node-set($temp)" mode="phase-2"/> 
+0

"*一般に、以前のテンプレートの結果にテンプレートを適用するのは、結果を変数に取り込むことです。* 2つのテンプレートが同じノードに一致する場合にのみ必要です。 –

+0

私は郵便のタイトルの質問に答えていましたが、近く読んだところでは、実際に説明されている問題との関係はほとんどないと同意しました。 –

0

あなたが最初の後に適用される第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, '.'))]"/> 

ただし、2番目のテンプレートはあまり意味がありません。率直に言って、あなたの最初のテンプレートは、あまりにも、ちょっと厄介です

<xsl:template match="*"> 
    <xsl:element name="{substring-after(name(), '.')}"/> 
</xsl:template> 

- 私はあなたがこの作業のためにMuenchian groupingに見て示唆している:私はそれのようなものであるべきと考えています。

+0

私はXSLでかなり新しいです、私は昨日以来、私が今知っているほとんど全てを学んできました。 Muenchianのグループ化方法を調べましたが、要素名自体ではなく、値を順序付けることしかできないようです。それとも間違っているのか分かりましたが、もう一度見直さなければなりませんか? –

+0

@Pieter_movあなたの理解は間違っています。キーを ''として定義し、そこから続行してください。 –

関連する問題