Как нумеровать отсортированный список в XSLT
Я использовал xsl:sort в apply-templates для сортировки элементов, и я хотел бы, чтобы они также были пронумерованы, но если я попытаюсь использовать xsl: number, то он просто дает исходную позицию, а не позицию после сортировки. Я думаю, что переменные также не могут быть использованы, потому что они не могут быть изменены? Так как же мне правильно нумеровать мой список?
2 ответа
Из комментария ОП:
О, это сработало! Спасибо! Я не использовал цикл for-each, имел
<xsl:apply-templates select="book">
вместо. Но для каждого это работает
Вот два примера, оба с использованием <xsl:apply-templates>
- нет <xsl:for-each>
:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<xsl:apply-templates>
<xsl:sort select=". mod 3"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="num">
<xsl:text>
</xsl:text>
<xsl:value-of select="position()"/>: <xsl:text/>
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к следующему документу XML:
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
Он создает нумерованный список элементов, отсортированный по остаткам при делении на 3:
1: <num>03</num>
2: <num>06</num>
3: <num>09</num>
4: <num>01</num>
5: <num>04</num>
6: <num>07</num>
7: <num>10</num>
8: <num>02</num>
9: <num>05</num>
10: <num>08</num>
Второй пример - это идиома программирования, широко используемая в XSLT 1.0:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<numsMax>
<xsl:apply-templates>
<xsl:sort data-type="number" order="descending"/>
</xsl:apply-templates>
</numsMax>
</xsl:template>
<xsl:template match="num">
<xsl:if test="position()=1">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется к следующему документу XML:
<nums>
<num>07</num>
<num>10</num>
<num>05</num>
<num>02</num>
<num>03</num>
<num>08</num>
<num>04</num>
<num>01</num>
<num>06</num>
<num>09</num>
</nums>
Выдает максимум всех чисел, используя position()=1
в отсортированном списке узлов:
<numsMax>
<num>10</num>
</numsMax>
Ты можешь использовать <xsl:value-of select="position()" />
чтобы получить текущую позицию в цикле.
Из спецификации xpath: функция position возвращает число, равное позиции контекста, из контекста вычисления выражения.
XML:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<library>
<book><name>abc</name></book>
<book><name>def</name></book>
<book><name>aaa</name></book>
</library>
XSLT (test.xsl):
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="/library/book">
<xsl:sort select="name" data-type="text" />
<xsl:value-of select="position()" />: <xsl:value-of select="name" />,
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>