Текущий узел по сравнению с узлом Контекста в XSLT/XPath?

Проблема с использованием реальной функции сна состоит в том, что JavaScript является однопоточным, и функция сна в значительной степени заставит ваш браузер зависать в течение этого времени.

65
задан bluish 6 October 2011 в 09:51
поделиться

1 ответ

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

71
ответ дан 24 November 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: