<xsl:for-each-group select="." group-by="substring-before(@Criteria, ' - ')">
Это бессмысленно. Выражение в атрибуте select
выбирает отдельный элемент . Группировка имеет смысл, когда выбрано более одного элемента, и мы хотим сгруппировать их по определенным критериям.
Когда один элемент «сгруппирован», «результатом» всегда является тот же элемент - это именно то, что вы получаете.
Решение : правильно выберите группу элементов, которые нужно сгруппировать. Или используйте это альтернативное решение:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="vallKeys" select=
"distinct-values
(/*/*/@criteria
/substring-before(.,'-')
)
"/>
<xsl:template match="/">
<xsl:for-each select="$vallKeys">
<xsl:value-of select=
"concat(position(),'.',.,'
')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к следующему XML-документу (получено из предоставленного фрагмента путем исправления его серьезного искажения):
<someParent>
<InterSection criteria="Microsoft-ASP">value</InterSection>
<InterSection criteria="Microsoft-MVC">value</InterSection>
<InterSection criteria="HP-MVC">value</InterSection>
</someParent>
желаемый, правильный результат получается :
1.Microsoft
2.HP