xslt: совпадающая позиция отфильтрованного и отсортированного набора результатов - PullRequest
2 голосов
/ 24 февраля 2011

это продолжение к этому сообщению .По сути, мне нужно получить position() элементов в отфильтрованной и отсортированной коллекции .Любой совет, как поступить с этим?

Спасибо!

XML:

<?xml version="1.0" encoding="utf-8"?>
<news>
    <newsItem id="1">
        <title>Title 1</title>
    </newsItem>
    <newsItem id="2">
        <title>Title 2</title>
    </newsItem>
    <newsItem id="3">
        <title></title>
    </newsItem>
    <newsItem id="4">
        <title></title>
    </newsItem>
    <newsItem id="5">
        <title>Title 5</title>
    </newsItem>
</news>

XSL:

<xsl:template match="/">
    <ol>
        <xsl:apply-templates select="/news/newsItem [string(title)][3 > position()]">
            <xsl:sort order="descending" data-type="number" select="@id"/>
        </xsl:apply-templates>
    </ol>
</xsl:template>

<xsl:template match="newsItem">
    <li>
        <xsl:value-of select="title"/>
    </li>
</xsl:template>

<xsl:template match="*" />

Желаемый результат:

  1. Название 5
  2. Название 2

Фактический результат:

  1. Название 2
  2. Название 1

1 Ответ

4 голосов
/ 24 февраля 2011

Вы действительно должны посмотреть на мой ответ о списке узлов контекста.

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <ol>
            <xsl:apply-templates select="/news/newsItem [string(title)]">
                <xsl:sort order="descending" data-type="number" select="@id"/>
            </xsl:apply-templates>
        </ol>
    </xsl:template>
    <xsl:template match="newsItem">
        <xsl:if test="3 > position()">
            <li>
                <xsl:value-of select="title"/>
            </li>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Вывод:

<ol>
    <li>Title 5</li>
    <li>Title 2</li>
</ol>
...