Оцените внешнее выражение xpath в предикате xpath - PullRequest
0 голосов
/ 26 августа 2010

У меня проблема с оператором xpath.

По сути, проблему можно объяснить следующим кодом:

<xsl:for-each select="/b1im:B1IMessage/b1im:Header/b1im:Z/SortInbound/group">
                    <!-- Check if entry from duplicate table is found for the current AccountingEntry -->
                    <xsl:variable name="externalId" select="../externalId"></xsl:variable>
                    <xsl:value-of select="/b1im:B1IMessage/b1im:Body/b1im:Payload[@ObjectRole=&apos;CA&apos;]/jdbc:SqlResult/jdbc:ResultSet/jdbc:Row[jdbc:external_id= /../externalId]/jdbc:external_id"></xsl:value-of>
                    <xsl:variable name="group" select="./@id"></xsl:variable>                        
                    <!-- if it is no dupe => output -->
                     <xsl:choose>
                            <xsl:when test="/b1im:B1IMessage/b1im:Body/b1im:Payload[@ObjectRole=&apos;CA&apos;]/jdbc:SqlResult/jdbc:ResultSet/jdbc:Row[jdbc:external_id = ../externalId]/jdbc:external_id">

Я хочу использовать значениеof "../externalId" (контекст for-each) для теста (последняя строка) .. Это сработало бы, если бы я использовал переменную ($ externalId), но переменная была установлена ​​только один раз (итерация первого цикла)Есть ли способ, как я могу получить доступ к for-each-context в выражении xpath?

Заранее спасибо !!Tobias

Ответы [ 2 ]

2 голосов
/ 26 августа 2010

На каждом этапе оценки XPath «.» (то есть узел контекста) имеет различное значение. В вашем XPath выражении
... jdbc:ResultSet/jdbc:Row[jdbc:external_id = ../externalId] узел контекста в предикате определяется предыдущими шагами в вашем выражении XPath, поэтому вы фактически сравниваете с externalID потомком элемента jdbc:ResultSet. Для сравнения со значением ../externalID для каждого контекстного узла вы можете попробовать использовать функцию XSLT current().

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = current()/../externalId]

1 голос
/ 27 августа 2010

Два вопроса.

Во-первых, как ответил @jasso, при оценке предикатов контекст определяется последним шагом.Начиная с http://www.w3.org/TR/xpath/#predicates

Предикат фильтрует набор узлов относительно оси для создания нового набора узлов.Для каждого узла в наборе узлов, подлежащем фильтрации, PredicateExpr оценивается с этим узлом в качестве узла контекста, с числом узлов в наборе узлов в качестве размера контекста и с позицией близости узла в узле-установить относительно оси как контекстную позицию

Секунда.Вы писали:

Это работало бы, если бы я использовал переменную ($ externalId), но переменная была установлена ​​только один раз (итерация первого цикла) ...

Этоне правда.Шаблон содержимого for-each создается один раз для каждого узла в его выбранном наборе узлов.Таким образом, externalId получает оценку один раз для каждого из таких узлов.

Итак, правильный ответ от @jasso:

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = current()/../externalId]

То же, что:

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = $externalId]
...