XSLTでは、「現在のノード」と「コンテキストノード」の違いは何ですか?ここで使用されている両方の用語を見つけることができます: http://www.w3.org/TR/xslt 。
いつどちらを使用しますか?それぞれをどのように参照しますか?
現在のノードは、テンプレートが現在動作しているものは何でもです。通常、これはコンテキストノードでもありますが、コンテキストノードは、ネストされたXPath式(角括弧内の部分)内で特別な意味を持ちます。そこでは、現在一致するかどうかテストされているノードを参照します。したがって、コンテキストノードはXPath式内で変更されますが、現在のノードでは変更されません。
コンテキストノードは、ドット(_.
_)で短縮することも、完全に省略することもできます。ネストされた式の外側では、ドットは現在のノードを意味するため、これはおそらく少しわかりにくいでしょう。 (その場合、現在のノードはたまたまコンテキストノードであるため、現在のノードが最も近いと言うかもしれません。より適切にはコンテキストノードと呼ばれます。しかし、仕様でもここでは現在のノードと呼びます。)
ドットはコンテキストノードを提供するため、ネストされたXPath式では、ユーザーは現在のテンプレートによって処理されている現在のノードを参照する方法を必要とします。これは、current()
関数を介して実行できます。
これら2つを区別することは、場合によっては便利です。たとえば、次のようなXMLがあるとします。
_<a>
<b>
<c>foo<footnote fn="1"/></c>
<d>bar</d>
</b>
<b>
<c>baz</c>
<d>aak<footnote fn="2"/></d>
</b>
<b>
<c>eep</c>
<d>blech<footnote fn="2"/></d>
</b>
<footnote-message fn="1">Batteries not included.</footnote>
<footnote-message fn="2">Some Assembly required.</footnote>
</a>
_
次のようにLaTeXに変換したいとします:
_foo\footnote{Batteries not included.}
bar
baz
aak\footnote{Some Assembly required.}
eep
blech\footnotemark[2]
_
トリックは、脚注がすでに使用されているかどうかを判断することです。脚注に出会ったのがこれが初めての場合は、_\footnote
_コマンドを作成します。それ以外の場合は、_\footnotemark
_コマンドを作成します。次のようなXSLコードを使用できます。
_<xsl:choose>
<xsl:when test="count(preceding::*[./@fn = current()/@fn]) = 0">\footnote{...}</xsl:when>
<xsl:otherwise>\footnotemark[...]</xsl:otherwise>
</xsl:choose>
_
ここでは、コンテキストノードfn
属性(_preceding::*
_ノードセットの結果)と現在のノードfn
属性を比較しています。 (実際に_./@fn
_と言う必要はありません; _@fn
_とだけ言うことができます。)
つまり、コンテキストノードを使用すると、XPath述語の内部に配置されます。現在のノードは述語の外側に到達し、現在のテンプレートによって処理されているノードに戻ります。
context nodeは、XPath評価コンテキスト そして、それぞれによって異なります 位置ステップ :
_step1 / step2 / step3 / ...
_
各step
は
_axis::node-test[predicate]
_
predicate
を評価する場合、コンテキストノードは_node-test
_を通過したaxis
に沿ったノードです。.
_としてアクセスできます。current node()は[〜#〜] xslt [〜#〜]処理モデル :1
current()
としてアクセスできます。1コンテキストノードと現在のノードの基本的な違いを理解することは重要ではありませんが、 XSLT 2.0の場合評価コンテキストの説明が変更されていることに注意してください。現在のノードと現在のノードリストの概念は、XPathの概念 context item 、コンテキスト位置、およびコンテキストに置き換えられました。サイズ。