$context/../@attname
не имеет особого смысла. Вы не можете идти "вверх" здесь, так как это приведет вас "вне" $context
.
Если набор узлов содержит что-то вроде этого (один узел)
<node attname="foo">
<bar />
</node>
, то:
$context/@attname
Если это так (список узлов):
<node attname="foo">
<bar />
</node>
<node attname="foo">
<bar />
</node>
, то:
$context[1]/@attname
Все это не работает, если переменная содержит фрагмент дерева результатов (RTF). В этом случае вам нужно использовать функцию расширения под названием node-set()
. Большинство процессоров XSLT предоставляют эту функцию.
РЕДАКТИРОВАТЬ: ваша переменная содержит объединение текущего узла и узла обнаженного атрибута от его родителя:
<xsl:with-param name="context" select=". | ../@res" />
Результат объединения всегда будет в порядке документа, поэтому даже если вы выбрали атрибут после узла контекста в XPath, в результирующем наборе узлов он будет до - родительский узел узла контекста находится перед узлом контекста в порядке документа.
Вам нужно $context[1]
для захвата узла атрибута и $context[2]
для захвата другого узла.
Я должен сказать, что это странное и, вероятно, ненужное сложное использование переменных. Я уверен, что есть способ сделать это менее болезненным способом. Например, вы могли бы сделать
<xsl:with-param name="context" select="." />
и затем используйте $context/../@res
в вызываемом шаблоне. Это было бы намного проще, чем то, что вы пытаетесь сейчас.
Кроме того, , если <xsl:with-param>
, который вы здесь показываете, является частью <xsl:call-template>
, вы можете полностью отбросить этот параметр. Когда шаблон вызывается (а не применяется), узел контекста не изменяется, передавая его излишне.