Я использую значение индекса xpath2 для возврата индекса current () в отсортированной последовательности узлов.Используя SAXON, отсортированная последовательность узлов является уникальной, но index-of возвращает последовательность из двух значений.
Это не происходит постоянно, просто очень редко, но не по какой-либо причине, которую я могу найти.Может кто-нибудь объяснить, что происходит?
Я разработал минимальный пример, основанный на примере данных, которые подпрограммы дают такое странное поведение.
Исходные данные:
<data>
<student userID="1" userName="user1"/>
<session startedOn="01/16/2012 15:01:18">
</session>
<session startedOn="11/16/2011 13:31:33">
</session>
</data>
Мой xsl-документ помещает узлы сеанса в отсортированную последовательность $ orderd в самом верху корневого шаблона:
<xsl:template match="/">
<xsl:variable name="nodes" as="node()*" select="/data/session"></xsl:variable>
<xsl:variable name="orderd" as="node()*">
<xsl:for-each select="$nodes">
<xsl:sort select="xs:dateTime(xs:dateTime(concat(substring(normalize-space(@startedOn),7,4),'-',substring(normalize-space(@startedOn),1,2),'-',substring(normalize-space(@startedOn),4,2),'T',substring(normalize-space(@startedOn),12,8)))
)" order="ascending"/>
<xsl:sequence select="."/>
</xsl:for-each>
</xsl:variable>
Поскольку узлы уже были упорядочены @startOn, но в обратном порядкепоследовательность $ orderd должна быть такой же, как и последовательность $ в порядке упорядоченных узлов, за исключением обратного порядка.
Когда я создаю вывод, используя оператор for-each, я обнаруживаю, что два узла почему-то рассматриваются как идентичныепри тестировании с использованием index-of.
Приведенный ниже код используется для вывода данных (и идет сразу же после фрагмента выше):
<output>
<xsl:for-each select="$nodes">
<xsl:sort select="position()" order="descending"></xsl:sort>
<xsl:variable name="index" select="index-of($orderd,current())" as="xs:integer*"></xsl:variable>
<xsl:variable name="pos" select="position()"></xsl:variable>
<session reverse-documentOrder="{$pos}" sortedOrder="{$index}"/>
</xsl:for-each>
</output>
Как показывает вывод (показанный ниже),Функция index-of возвращает последовательность (1,2), то есть она видит оба узла как идентичные.Я проверил выражение, используемое для сортировки значений, и оно дает четкие и правильно сформированные строки даты-времени.
<output>
<session reverse=documentOrder="1"
sortedOrder="1 2"/>
<session reverse-documentOrder="2"
sortedOrder="1 2"/>
</output>