Как установить значение переменной в udf, требующем вызова пути - PullRequest
0 голосов
/ 27 октября 2011

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

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

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

<xsl:function name="udf:LeafMatch">
<xsl:param name="sID"></xsl:param>
<xsl:variable name="myLeaf" select="/potato/stem[@sessionID=$sID][scc]/scc/@leafnumber"/>

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

<xsl:for-each select="$root">
<xsl:value-of select="/potato/stem[@sessionID=$sID][scc]/scc/@leafnumber"/>
</xsl:for-each>

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

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

<xsl:choose><xsl:when select"$root"><xsl:value-of select="/potato/stem[@sessionID=$sID][scc]/scc/@leafnumber"/></xsl:when></xsl:choose>

, чтобы дать ему контекст, продолжая то, что я видел здесь: http://www.stylusstudio.com/xsllist/200504/post00240.html

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

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

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

<xsl:for-each select="/potato/stem[eye]">
<leaf = "{udf:LeafMatch(@sessionID)}"/>
</xsl:for-each>

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

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

Итак, мои вопросы:

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

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

1 Ответ

0 голосов
/ 28 октября 2011

Итак, мои вопросы:

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

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

Оба вопроса совершенно неясны.

A: Полагаю, вы на самом деле имеете в виду:

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

Ответ : Вы не можете. По определению, внутри xsl:function нет узла контекста. Это определяется спецификацией W3C XSLT 2.0 следующим образом:

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

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

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

  1. Что такое "шикарный"?

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

...