Проблема с использованием реальной функции сна состоит в том, что JavaScript является однопоточным, и функция сна в значительной степени заставит ваш браузер зависать в течение этого времени.
Текущий узел - это то, на чем в данный момент работает шаблон. Обычно это также контекстный узел, но контекстный узел имеет особое значение во вложенном выражении 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>
Здесь мы сравниваем атрибут context-node fn
(из результатов предшествующего :: *
node-set) атрибуту current-node fn
. (На самом деле вам не нужно говорить ./@ fn
; вы можете просто сказать @fn
.)
Короче говоря, узел контекста оставляет вас внутри предиката XPath ; текущий узел выходит за пределы предиката, обратно к узлу, обрабатываемому текущим шаблоном.