2016-04-26 13 views
1

私はXSLの教師ではありませんが、私が行くように動機づけられた素人の学習者です。私は、自分が所有しておらず、一人で残しておきたいテンプレートの大きなライブラリをインポートするXSLスタイルシートに取り組んでいます。インポートされたテンプレートに渡す前に要素を前処理する

私は、特定の要素を傍受し、インポートしたテンプレートに渡す前に小さな変更を加える方法を見つけようとしています。具体的には、<image>要素の属性値を変更したいが、それ以外の場合は通常どおり処理を進めることができる。これは実行可能でなければならないようですが、私は困惑しています。 image_interceptテンプレートがループして終わるので、

<!-- intercept image elements before imported template sees them --> 
<xsl:template match="image" name="image_intercept"> 
    <!-- preprocess image element and capture it in a variable --> 
    <xsl:variable name="preprocessed_image"> 
    <xsl:apply-templates select="." mode="preprocess-image" /> 
    </xsl:variable> 
    <!-- Now send the modified version on to the imported template.... 
     except of course this doesn't work --> 
    <xsl:apply-templates select="$preprocessed_image" /> 
</xsl:template> 

<xsl:template match="*" mode="preprocess_image"> 
    <!-- For this example I'll just copy it through unchanged. 
     In reality I'll change an attribute value. --> 
    <xsl:copy-of select="." /> 
</xsl:template> 

これが失敗し、私はそれが希望期待通り:

この

は、私は現在動作しません。これは、持っているものです。同じテンプレートで再び一致させたくありません。代わりに <image>要素に一致するインポートされたテンプレートに $preprocessed_imageを渡したいと思います。しかし、私はそれを行う方法を理解することはできません。
... 
<!-- apply templates with mode to avoid looping --> 
<xsl:apply-templates select="$preprocessed_image" mode="passthrough"/> 
... 

<!-- hand off processing to imported template --> 
<xsl:template match="*" mode="passthrough"> 
    <xsl:apply-imports/> 
</xsl:template> 

しかし <xsl:apply-imports>は、テンプレートモード( "passthrough")、と私は何のモードを持っていないにハンドオフしようとしているインポートされたテンプレート)を継承するため、それは動作しません:私はこれを試してみました。

ご意見ありがとうございます。

答えて

0

<!-- intercept image elements before imported template sees them --> 
<xsl:template match="image[not(@att-name)]" name="image_intercept"> 
    <!-- preprocess image element and capture it in a variable --> 
    <xsl:variable name="preprocessed_image" as="element()"> 
    <xsl:apply-templates select="." mode="preprocess-image" /> 
    </xsl:variable> 
    <!-- Now send the modified version on to the imported template.... 
     except of course this doesn't work --> 
    <xsl:apply-templates select="$preprocessed_image" /> 
</xsl:template> 

<xsl:template match="*" mode="preprocess_image"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:attribute name="att-name" select="'foo'"/> 
    <xsl:copy-of select="node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="image[@att-name]"> 
    <xsl:apply-imports/> 
</xsl:template> 

にあなたはモードの問題を回避することを可能にするよう、一致パターンでそれを使用して、おそらくその要素を区別するための属性サーバの場合。

+0

Hmm。私はそれがどのように機能するか見ていない。 'image-intercept'テンプレートで' xsl:next-match'を起動しただけでは、 '$ preprocessed_image'変数の変更されたバージョンではなく、コンテキストノード(変更されていない' image')上で動作します。 – rrberry

+0

@rrberry、私は別の提案をした、編集された答えを参照してください。 –

関連する問題