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"
)、と私は何のモードを持っていないにハンドオフしようとしているインポートされたテンプレート)を継承するため、それは動作しません:私はこれを試してみました。
ご意見ありがとうございます。
Hmm。私はそれがどのように機能するか見ていない。 'image-intercept'テンプレートで' xsl:next-match'を起動しただけでは、 '$ preprocessed_image'変数の変更されたバージョンではなく、コンテキストノード(変更されていない' image')上で動作します。 – rrberry
@rrberry、私は別の提案をした、編集された答えを参照してください。 –