Текущий узел против узла контекста в XSLT / XPath? - PullRequest
62 голосов
/ 20 июня 2009

В XSLT, в чем разница между "текущим узлом" и "контекстным узлом"? Вы можете найти оба термина здесь: http://www.w3.org/TR/xslt.

Когда бы вы использовали один или другой? Как вы относитесь к каждому?

Ответы [ 2 ]

70 голосов
/ 20 июня 2009

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

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

Поскольку точка дает вам узел контекста, во вложенном выражении 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 (из результатов набора preceding::*) с атрибутом current-node fn. (На самом деле вам не нужно говорить ./@fn; вы можете просто сказать @fn.)

Короче говоря, контекстный узел оставляет вас внутри предиката XPath; текущий узел выходит за пределы предиката, обратно к узлу, обрабатываемому текущим шаблоном.

1 голос
/ 03 сентября 2018

Контекст Узел

Узел контекста является частью XPath оценочного контекста и зависит от каждого шаг местоположения :

step1 / step2 / step3 / ...

, где каждый step равен

axis::node-test[predicate]
  • Каждый шаг оценивается по отношению к узлам контекста, установленным , предшествующим шагам.
  • Затем каждый шаг выбирает узлы, которые становятся узлом контекста для после шагов .
  • При оценке predicate контекстный узел является узлом вдоль axis, который прошел node-test.
  • Узел контекста доступен как ..

Ток Узел

Текущий узел () является частью XSLT модели обработки : 1

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

1 Хотя это несущественно для понимания основного различия между узлом контекста и текущим узлом, обратите внимание, что в XSLT 2.0 описание контекста оценки был изменен. Концепции текущего узла и списка текущих узлов были заменены концепциями XPath элемент контекста , положение контекста и размер контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...