Как установить значение переменной в udf, требующем вызова по пути

Я пытаюсь использовать пользовательскую функцию в XSLT, которая повторно вызывает значение определенной строки. Эта строка основана на результате выражения XPath, которое не изменяется в пределах диапазона одного вызова функции. Я подумал, что было бы неплохо назначить его переменной, а не искать ее снова и снова.

К сожалению, по крайней мере, в реализации Saxon вы не можете использовать выражение XPath, требующее узла внутри функции, даже одного, основанного на абсолютном пути, без использования линии отбрасывания, чтобы функция могла знать, что вы обсуждаете корневой документ, а не другой.

Так, например, следующий код вызывает ошибку:

```

```

Обычно решение состоит в том, чтобы сначала вызвать любую глобальную переменную, чтобы дать контекст. Например, следующие действия внутри udf ($ root - это переменная, идентифицированная с корневым узлом):

```

```

Но это не работает при попытке использовать Xpath для исправления значения переменной, потому что мне не разрешено помещать выражение внутри каждого из них.

Я также попытался использовать

```

```

to give it context, going on what I saw here:<http://www.stylusstudio.com/xsllist/200504/post00240.html>

Это тоже не сработало.

FWIW, передача переменной в функцию проблематична, потому что выражение Xpath, используемое для определения «myleaf», зависит от контекстного узла, и я не знаю, как заставить Xpath вызывать один путь на основе значений в текущем узле контекста.

Например, в коде, вызывающем эту функцию, у меня есть что-то вроде:

```

```

Я работаю в контексте узла/potato/stem [eye] и используя udf для поиска узла/potato/stem [scc], который имеет такое же значение @sessionID. Я не знаю, как ссылаться на значение @sessionID из текущего контекстного узла в предикате XPath, ища другие узлы в совершенно другой части дерева XML, поэтому я использовал udf для этого. Он работал нормально, пока я не решил использовать переменную для строки, а не каждый раз, когда процессор ее просматривал.

Я старался избегать перехода на один уровень глубже (сама моя функция вызывала именованный шаблон или помещала именованный шаблон внутри моего оригинала для каждого из них и имел тот же шаблон, который вызывал функцию).

Поэтому мои вопросы:

A. Для пользовательской функции, как установить переменную, зависящую от выражения XPath?

B. Есть ли в Xpath классный способ использования значений, полученных из текущего узла контента в предикатах выражения Xpath, которое вы пытаетесь протестировать?

>  Итак, мои вопросы: 
> 
> 
>   
>   <Р> а. Для пользовательской функции, как установить переменную, которая зависит
>   на выражение XPath? 
>   
>   <Р> В. Есть ли в Xpath быстрый способ использовать значения, полученные из текущего
>   узла контента в предикатах выражения Xpath, которое вы пытаетесь
>   проверить? 

Оба вопроса довольно неясны.

A: Я предполагаю, что вы на самом деле имеете в виду:

>  "Внутри  `xsl: function`  как определить переменную, зависящую от
>   узел контекста? "
> 
> 

**The answer**: You can't. By definition there is no context node within an `xsl:function`. This is defined by the **[W3C XSLT 2.0 specification](https://www.w3.org/TR/xslt20/#element-function)** in the following way:

>  " *Внутри тела таблицы стилей фокус изначально
>   не определено; это означает, что любая попытка ссылки на элемент контекста,
>   контекстная позиция или размер контекста - невосстанавливаемая динамическая ошибка.
>   [XPDY0002] "* 
> 
> 

Однако вы можете передать в качестве параметра предназначенный контекстный узел (или просто узел документа, который должен использоваться как текущий). Или, альтернативно, вы можете ссылаться на глобально определенную переменную.

B: Этот вопрос совершенно непонятен:

1. Что такое «злобный»?
2. Что такое «текущий узел содержимого»? Пожалуйста, представьте пример конкретной задачи, которая должна быть выполнена по желаемому «унылому» способу.