Я пытаюсь использовать пользовательскую функцию в 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, которое вы пытаетесь проверить?