2011-07-21 4 views
3

非常に複雑なXSLT 1.0変換(現在は8つのXSLTパスを使用しています)を行っています。私は1つのファイルにこれをマージせずにこの8つのパスを組み合わせたい(これは複雑すぎるだろう)。私の解決策は、xsl:includeexsl:node-setを使用してパスをマージし、一時的な結果を変数に格納することです。同じノードを処理する複数のXSLT 1.0パスを組み合わせる最良の方法

しかし、私には1つの問題があります。私の変換は、ほとんどのノードをコピーし、特定の側面だけを変更します。したがって、すべてのパスで同じノードを処理する必要がありますが、が異なるxsl:template!しかし、どうすればいいのですか?最初のパスの後、他のXSLTスタイルシートからテンプレートを適用したいと言う方はどうすればいいですか? (2 XSLTが通過する)私が現在やっている

非常に簡単な例:

出典:

<h>something here</h> 

XSLTパス1後:

<h someattribute="1">something here</h> 

2 XSLTのパスの後:

<h someattribute="1" somemoreattribute="2">something here, and even more</h> 

<xsl:param name="iteration"/> 

を使用して、スタイルシートに繰り返し回数を渡さないのはなぜ

xsltproc stylesheet1.xsl input.xml >temp.xml 
xsltproc stylesheet2.xsl temp.xml >finalresult.xml 
+1

+1この[回答](http://stackoverflow.com/questions/6720009/multiple-xslt-files-to-single-xslt-file-for-2-different-xml-files/6720353#6720353)と@ Jukkaの答えを参照してください。 –

答えて

2

ワン:あなたは、この

<xsl:if test="$iteration = 1"> 
    ... 
</xsl:if> 

...またはあなたが

javax.xml.transform.Transformer.setParameter("iteration", 1); 

またはAntとしてパラメータを設定することができます

他の文脈のようにそれを使用することができます考えられる解決策は、それぞれのスタイルシートを別の modeを使用するように変更することです。あなたはマスタースタイルシートにそれらのすべてをインポートし、順番に各モードを使用してテンプレートを適用することにより、複数のパスを行うことができ、その後:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:exsl="http://exslt.org/common" 
       extension-element-prefixes="exsl" 
       version="1.0"> 

    <xsl:import href="stylesheet1.xsl"/> <!-- assuming mode="stylesheet1" --> 
    <xsl:import href="stylesheet2.xsl"/> <!-- assuming mode="stylesheet2" --> 
    <xsl:import href="stylesheet3.xsl"/> <!-- assuming mode="stylesheet3" --> 

    <xsl:template match="/"> 
    <xsl:variable name="temp1"> 
     <xsl:apply-templates select="." mode="stylesheet1"/> 
    </xsl:variable> 
    <xsl:variable name="temp2"> 
     <xsl:apply-templates mode="stylesheet2" select="exsl:node-set($temp1)"/> 
    </xsl:variable> 
    <xsl:apply-templates mode="stylesheet3" select="exsl:node-set($temp2)"/> 
    </xsl:template> 

</xsl:stylesheet> 

欠点は、あなたがオリジナルのスタイルシートを変更する必要があるということです、各xsl:templateに適切なmode属性を追加し、 xsl:apply-templates。スタイルシートを独立して動作させるには、次のような別のテンプレートをそれぞれに追加することができます。

+0

すばらしい答えJukka。 XSLTを書き直して、モードを追加するのは私にとっては問題ありません。そんなに書いてくれてありがとう。私はXSLTについて新しいことを学びました。 – therealmarv

+0

2つの場所で 'select ="。 "'を 'xsl:apply-templates'に追加してXSLTを修正して、スタイルシートが適切にルートノードにテンプレートを適用するようにしました。 –

0

:私の現在のアプローチは、ディスク上の一時的な結果を保存二回XSLTプロセッサを呼び出してするのですか?

<xslt ...> 
    <param name="iteration" expression="1"/> 
</xslt> 
+0

'xsl:param'を使うと、私のテンプレートに大きな' xsl:choose'構造があり、誰も理解できないXSLTが1つしかありません。私は8つの別個のXSLTを持っている理由があります - >それらは非常に複雑で、8つに分離しています。XSLTは、それらを保守可能に保つ唯一のオプションでした。 – therealmarv

関連する問題