2009-06-20 14 views

答えて

68

現在のノードは、テンプレートが現在動作しているものです。通常これはコンテキストノードにもなりますが、コンテキストノードはネストされた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> 

は今、あなたはそれがこのようにラテックスに変換したいとします

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述語の中にいます。現在のノードは述語の外側に到達し、現在のテンプレートによって処理されているノードに戻る。

+1

これは自軸とどのように関連していますか? – Devela

関連する問題