xsl:number
вернет позицию текущего элемента во входном XML независимо от того, как вы его выбрали или пытаетесь отсортировать.Если вы хотите найти позицию после сортировки, вы должны использовать position()
<xsl:value-of select="concat(position(), '. ')" />
Однако вам придется немного проделать дополнительную работу во втором шаблоне, поскольку вам нужно будет передать вположение родителя workItem
в качестве параметра, позволяющего получить полный номер
Попробуйте это XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" />
<xsl:template match="/">
<xsl:apply-templates select="/result/workitem">
</xsl:apply-templates>
</xsl:template>
<xsl:template match="workitem[@type='Feature']">
<xsl:variable name="level" select="count(ancestor-or-self::*) "/>
<xsl:element name="h{$level}">
<xsl:attribute name="class">
<xsl:value-of select="translate(System.WorkItemType,' ','')"/>
</xsl:attribute>
<xsl:value-of select="concat(position(), '. ')" />
<xsl:value-of select="System.WorkItemType" />
#<xsl:value-of select="System.Id" />
</xsl:element>
<xsl:apply-templates select="workitem">
<xsl:with-param name="parentPos" select="position()" />
<xsl:sort select="@type" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="workitem[@type='Bug' or @type='User Story']">
<xsl:param name="parentPos"/>
<xsl:variable name="level" select="count(ancestor-or-self::*) "/>
<xsl:element name="h{$level}">
<xsl:attribute name="class">
<xsl:value-of select="translate(System.WorkItemType,' ','')"/>
</xsl:attribute>
<xsl:value-of select="concat($parentPos, '.', position(), '. ')" />
<xsl:value-of select="System.WorkItemType" />
#<xsl:value-of select="System.Id" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Однако вы можете знать, что вы можете выполнить автоматическую нумерациюсписок дочерних элементов с использованием счетчиков CSS, а не пытаться сделать это в XSLT.
Попробуйте это тоже
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes" html-version="5" />
<xsl:template match="/">
<html>
<head>
<style>
ol {
counter-reset: section;
list-style-type: none;
}
li:before {
counter-increment: section;
content: counters(section, ".") ". ";
}
h1, h2, h3 {
display:inline;
}
</style>
</head>
<body>
<xsl:apply-templates select="/result/workitem" />
</body>
</html>
</xsl:template>
<xsl:template match="workitem[@type='Feature']">
<xsl:variable name="level" select="count(ancestor-or-self::*) "/>
<ol>
<li>
<xsl:element name="h{$level}">
<xsl:attribute name="class">
<xsl:value-of select="translate(System.WorkItemType,' ','')"/>
</xsl:attribute>
<xsl:value-of select="System.WorkItemType" /> #<xsl:value-of select="System.Id" />
</xsl:element>
<ol>
<xsl:apply-templates select="workitem">
<xsl:sort select="@type" />
</xsl:apply-templates>
</ol>
</li>
</ol>
</xsl:template>
<xsl:template match="workitem[@type='Bug' or @type='User Story']">
<xsl:variable name="level" select="count(ancestor-or-self::*) "/>
<li>
<xsl:element name="h{$level}">
<xsl:attribute name="class">
<xsl:value-of select="translate(System.WorkItemType,' ','')"/>
</xsl:attribute>
<xsl:value-of select="System.WorkItemType" /> #<xsl:value-of select="System.Id" />
</xsl:element>
</li>
</xsl:template>
</xsl:stylesheet>