Текущий узел и контекстный узел в XSLT / XPath?


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

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

2 62

2 ответа:

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

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

поскольку точка дает вам контекстный узел, во вложенном выражении XPath пользователю нужен способ ссылаться на текущий узел, тот обрабатывается текущим шаблоном. Вы можете сделать это через . Вы можете использовать xsl-код такой:

<xsl:choose>
    <xsl:when test="count(preceding::*[./@fn = current()/@fn]) = 0">\footnote{...}</xsl:when>
    <xsl:otherwise>\footnotemark[...]</xsl:otherwise>
</xsl:choose>

здесь мы сравниваем контекст-узел fn атрибут (из результатов preceding::* node-set) к текущему узлу . (На самом деле вам не нужно говорить ./@fn, вы могли бы просто сказать @fn.)

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

контекст узел

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

step1 / step2 / step3 / ...

каждая step и

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

настоящее узел

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

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

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