Оценить внешнее выражение xpath в предикате xpath

у меня проблема с выражением 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">

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

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


person mnkypete    schedule 26.08.2010    source источник
comment
Добавление тега xslt, так как это выражение XPath размещено в XSLT   -  person    schedule 26.08.2010


Ответы (2)


На каждом этапе оценки 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]

person jasso    schedule 26.08.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]
person Community    schedule 26.08.2010
comment
@ Алехандро, хороший ответ +1. На практике, когда вы ответили на вопрос, мне редко приходится что-то добавлять к вашему ответу. - person Dimitre Novatchev; 27.08.2010
comment
@Dimitre: Джа! Спасибо! То же самое происходит и со мной. ;) - person ; 27.08.2010
comment
Спасибо вам обоим, все заработало :) метод с переменной не сработал у меня в первую очередь, потому что у меня была ошибка в моем input-xml. Тем не менее, полезно знать функцию current() ! Спасибо - person mnkypete; 27.08.2010