私は、XSLTを使用して複数のファイルを結合して処理しようとしています。ここで私が働いている構造の種類の例です:私は「XSLT:ドキュメントを挿入してからテンプレートを適用するにはどうすればよいですか?
page.html
<html>
<head/>
</html>
head.html
<head>
<title />
</head>
proc.xsl
<xsl:template match="/html/head">
<xsl:apply-templates select="document('head.html')/head" />
</xsl:template>
<xsl:template match="/head/title">
<title>this is a contrived example</title>
</xsl>
page.html
に対してproc.xsl
を適用する。すべて動作しますが、2番目のテンプレート要素の一致は、それを含むものではなくインクルードされたドキュメントからの相対的なものでなければならないことに注意してください。それは賢明ですか? apply-templates
命令がインクルードされたドキュメントではなくインクルードドキュメントのコンテキストで動作するようにする方法はありますか?明確にするために
、私が探しています結果は次のとおりです。私も試した
<html>
<head>
<title>this is a contrived example</title>
</head>
</html>
には、このようなXSLファイルで/インポート:
head.xsl
<xsl:template match="/html/head">
<head>
<title />
</head>
</xsl:template>
アゲイン、これはヘッドマークアップを注入しますが、title
要素の処理に失敗します。
私はあなたの質問を理解していません。 2番目のテンプレート(または任意のテンプレート)の一致は、「含まれているドキュメントとの相対的なもの」(または任意のドキュメント)ではありません。 'apply-templates'命令は、それが呼び出されるコンテキストで動作します。あなたの例では、 'page.html'文書の'/html/head'の文脈で - それは親テンプレートによって確立された文脈ですから。実際の問題は何ですか? –
申し訳ありませんが、私は専門用語が間違っていると確信しています。つまり、最初のテンプレートを最初のドキュメントに適用した結果ではなく、読み込まれたドキュメントと一致する、つまり/ htmlではなく、 '/ head'で始まる必要があります。私は後の結果の例を更新します。 –
'match =" head/title "'または単に 'match =" title "'にテンプレートマッチを変更するだけで、 'head'がルート要素かどうかは関係ありません。 –