(Примечание: этот пост был отредактирован, чтобы показать конкретный вариант использования. См. внизу.)
Я хочу использовать значение position() узла current внутри выражения xpath (в котором изменяется контекст). К сожалению, я не вижу простого способа сделать это, потому что current()/position() всегда равны 1.
[Я предполагаю, что это потому, что current()/position() говорит: «Какова позиция узла current() в контексте... набора из одного узла, содержащего только current().]
Чтобы быть конкретным, предположим, что у меня есть последовательность узлов $seq, и я хочу вернуть *n*й узел в последовательности ($seq[n]), где n равно текущему значению position() (то есть значение position() до оцениваемого оператора).
Ясно, что $seq[position()] не будет работать, потому что это расширяется до seq[position() = position()], возвращая всю последовательность.
$seq[position(current())] — это бред.
Единственное, что я мог найти, что, возможно, работает, это
for $pos in position() return $seq[$pos]
Я предполагаю, что есть более простой способ.
Изменить Меня попросили привести более конкретный пример того, что я пытаюсь сделать. На самом деле я нашел ответ первого человека достаточным для моих нужд, хотя и не намного проще, чем то, что я придумал сам (опция «for $pos in position() return $correctOrder[$pos]»).
Вот реальная ситуация: у меня есть набор «сеансовых» узлов, каждый из которых имеет атрибут @startTime. Я хочу найти, какие из них не соответствуют этому атрибуту @startTime или, по крайней мере, находятся не в том месте, где они были бы, если бы узлы входного документа были правильно отсортированы по @startTime.
Это всего лишь один из многих тестов, которые выполняются на каждом из узлов сеанса.
Что я хотел сделать, так это создать последовательность, в которой узлы были в правильном порядке, и сравнить n-й элемент в упорядоченной по документам последовательности с n-м элементом в правильно упорядоченной последовательности.
Что-то вроде этого:
<xsl:template match="/">
<xsl:variable name="correctOrder" as="node()*">
<xsl:for-each select="session">
<xsl:sort select="@xs:dateTime(@startTime)"/>
<xsl:sequence select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:for-each select="session">
‹---- Множество различных тестов ---->
<xsl:if test="current()/@startTime eq
$correctOrder[<-here I want to put the value "position()" had prior to this <xsl:if> statement->]/@startTime"
<error description="Node out of order."/>
</xsl:if>
‹--- Множество других тестов ----->
</xsl:for-each>
position()
сам по себе не определен.position()
против чего? Пожалуйста, отредактируйте вопрос и сделайте его менее двусмысленным и более четким. Конкретный пример был бы отличным. - person Dimitre Novatchev   schedule 28.01.2012