2009-07-14 15 views
0

私は現在、意図した出力を得るために2つのスタイルシートを使用しています。最初のスタイルシート(pass1.xsl)は実際の作業を行い、2番目のスタイルシート(pass2.xsl)は軽い書式の更新を提供しながら重複を削除します。XSLT:スタイルシートの統合

私の質問は、単一のスタイルシート内で両方のアクションを実行できるかどうかです。
私はコンテンツを見ているときに、両方のスタイルシートにテンプレートの一致が含まれているため、xsl:関数を使って感想を得ることはできません。 IE:

pass1.xsl:

<xsl:template match="xs:complexType"> 
    <xsl:param name="prefix" />  
    <xs:complexType name="{my:updateName($prefix, @name)}"> 

    <!-- insert xs:sequence ONLY if the child is NOT xs:complexContent --> 
    <xsl:choose> 
     <xsl:when test="*[name()='xs:complexContent']"> 
     <xsl:apply-templates select="node()" /> 
     </xsl:when> 
     <xsl:otherwise> 
     <xs:sequence> 
      <xsl:apply-templates select="node()" /> 
     </xs:sequence>    
     </xsl:otherwise> 
    </xsl:choose> 
    </xs:complexType> 
    <xsl:apply-templates select=".//xs:element" /> 
</xsl:template> 

pass2.xsl:

<xsl:template match="xs:complexType"> 
    <xsl:copy> 
    <xsl:apply-templates select="*|@*"/> 
    </xsl:copy> 
</xsl:template> 

繰り返しに - 目標は、最終的な結果を生成する唯一のスタイルシートを実行することです。 2つを走らせるのは難しいことではありませんが、しなければならないのはうれしいでしょう。元の&にコピー/貼り付けをしていますか、それとも私が見ているは​​ずのものを輸入していますか?誰かが間違ってサポートファイルを削除する可能性を最小限に抑えるため、1つのスタイルシートファイルしか持たないことをお勧めします。

答えて

1

テンプレートには別のmodesを使用する必要があります(xsl:templatexsl:apply-templatesステートメントにはすべてmode属性を追加する必要があります)。次に、デフォルトモードのルートノードのテンプレートは、最初にルートテンプレートを最初のモードで起動し、その結果を2番目のモードでルートテンプレートに渡します。そのためには、結果セットのツリーフラグメント(どのコンストラクタが生成するのか)をノードセット(これはテンプレートを適用したりXPath経由でクエリを実行することができる)として扱う必要があります。これを行う標準的な方法はありませんしかし、exsl:node-setはその事実上の標準です(それをサポートするプロセッサの完全なリストは、そのページのものよりも大きい - 例えば、.NET XslCompiledTransformがサポートしています)。従って:

<xsl:template match="/"> 
    <xsl:variable name="round1-output"> 
    <xsl:apply-templates select="/" mode="round1" /> 
    </xsl:variable> 
    <xsl:apply-templates select="exsl:node-set($round1-output)" mode="round2" /> 
</xsl:template> 

<xsl:template match="/" mode="round1"> 
    ... 
    <xsl:apply-templates mode="round1" /> 
    ... 
</xsl:template> 

<xsl:template match="/" mode="round2"> 
    ... 
    <xsl:apply-templates mode="round2" /> 
    ... 
</xsl:template> 

... 

<xsl:template match="xs:complexType" mode="round1"> 
    <xsl:param name="prefix" />   
    <xs:complexType name="{my:updateName($prefix, @name)}"> 
    <!-- insert xs:sequence ONLY if the child is NOT xs:complexContent --> 
    <xsl:choose> 
     <xsl:when test="*[name()='xs:complexContent']"> 
     <xsl:apply-templates select="node()" mode="round1"/> 
     </xsl:when> 
     <xsl:otherwise> 
     <xs:sequence> 
      <xsl:apply-templates select="node()" mode="round1"/> 
     </xs:sequence>       
     </xsl:otherwise> 
    </xsl:choose> 
    </xs:complexType> 
    <xsl:apply-templates select=".//xs:element" mode="round1"/> 
</xsl:template> 

<xsl:template match="xs:complexType" mode="round2"> 
    <xsl:copy> 
    <xsl:apply-templates select="*|@*" mode="round2"/> 
    </xsl:copy> 
</xsl:template> 
関連する問題