2009-06-20 3 views

ответ

68

Текущий узел - это то, на что в данный момент работает данный шаблон. Обычно это также является узлом контекста, но контекстный узел имеет особое значение внутри вложенного выражения XPath (часть в квадратных скобках). Там он ссылается на любой узел, который в настоящее время тестируется на соответствие. Следовательно, контекстный узел изменяется в выражении XPath, но не в текущем узле.

Контекстный узел может быть сокращен точкой (.) или иногда полностью исключен. Это, вероятно, немного запутанно, потому что вне вложенного выражения точка обозначает текущий узел. (В этом случае текущий узел является узлом контекста, поэтому можно сказать, что он является текущим узлом только ближе, и его более правильно называют узлом контекста. Но даже спецификация называет его текущим узлом здесь.)

Поскольку точка дает вам контекстный узел, в вложенном выражении XPath пользователю нужен способ обращения к текущему узлу, который обрабатывается текущим шаблоном. Вы можете сделать это с помощью функции current().

Различение этих двух полезных в некоторых случаях. Например, предположим, что у вас есть некоторые 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; текущий узел выходит за пределы предиката, обратно к узлу, обрабатываемому текущим шаблоном.

+1

Как это относится к самооценке? – Devela