web-dev-qa-db-ja.com

XSLT / XPathの現在のノードとコンテキストノード

XSLTでは、「現在のノード」と「コンテキストノード」の違いは何ですか?ここで使用されている両方の用語を見つけることができます: http://www.w3.org/TR/xslt

いつどちらを使用しますか?それぞれをどのように参照しますか?

63

現在のノードは、テンプレートが現在動作しているものは何でもです。通常、これはコンテキストノードでもありますが、コンテキストノードは、ネストされた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述語の内部に配置されます。現在のノードは述語の外側に到達し、現在のテンプレートによって処理されているノードに戻ります。

70

Contextノード

context nodeは、XPath評価コンテキスト そして、それぞれによって異なります 位置ステップ

_step1 / step2 / step3 / ...
_

step

_axis::node-test[predicate]
_
  • 各ステップは、precedingステップで設定されたコンテキストノードに関して評価されます。
  • 次に、各ステップは、followingステップのコンテキストノードになるノードを選択します。
  • predicateを評価する場合、コンテキストノードは_node-test_を通過したaxisに沿ったノードです。
  • コンテキストノードには_._としてアクセスできます。

Currentノード

current node()は[〜#〜] xslt [〜#〜]処理モデル1

  • 現在のノードは、XSLTテンプレートに最も一致するソースXMLドキュメント内のノードです。
  • 現在のノードは、一致したテンプレートの各XPath式の開始コンテキストノードになります。
  • 現在のノードは、XPath述語内でcurrent()としてアクセスできます。

1コンテキストノードと現在のノードの基本的な違いを理解することは重要ではありませんが、 XSLT 2.0の場合評価コンテキストの説明が変更されていることに注意してください。現在のノードと現在のノードリストの概念は、XPathの概念 context item 、コンテキスト位置、およびコンテキストに置き換えられました。サイズ。

2
kjhughes