Използвам xslt xpath v1.0 и следния xml:
<store>
<item>
<title>tshirt</titlet>
</item>
<item>
<title>shoes</titlet>
</item>
<item>
<title>boots</titlet>
</item>
<item>
<title>boots</titlet>
</item>
<item>
<title>shoes</titlet>
</item>
<item>
<title>boots</titlet>
</item>
</store>
Резултатът трябва да бъде списък в низходящ ред, като:
име на артикул (общ артикул в xml)
ботуши (3)
обувки (2)
тениска (1)
Намерих начин да ги идентифицирам, но не мога да намеря начин да преброя
<xsl:for-each select="item[not(preceding::item/. = .)]">
<xsl:value-of select="." />
</xsl:for-each>
Отговори:
3 за отговор № 1С чистия XPath 1 това е трудно, но тъй като използвате XSLT така или иначе, можете да го използвате Мюнхенска групировка да групират и xsl:sort
да сортирам:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" indent="yes" version="5" doctype-system="about:legacy-doctype"/>
<xsl:key name="group" match="item" use="title"/>
<xsl:template match="/">
<html>
<head>
<title>.NET XSLT Fiddle Example</title>
</head>
<body>
<ul>
<xsl:apply-templates select="store/item[generate-id() = generate-id(key("group", title)[1])]">
<xsl:sort select="count(key("group", title))" order="descending" data-type="number"/>
</xsl:apply-templates>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="item">
<li>
<xsl:value-of select="concat(title, " (", count(key("group", title)), ")")"/>
</li>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/nc4NzQb
0 за отговор № 2
Може да използвате това:
<xsl:variable name="FullXml" select="/store"/>
<xsl:for-each select="distinct-values(/store/item/title/text())">
<xsl:variable name="TheContent" select="." />
<xsl:value-of select="$TheContent"/>(<xsl:value-of select="count($FullXml/item[title/text()=$TheContent])" />)
</xsl:for-each>
с distinct-values()
ще получите списък на всички стойности и с .count()
можете да намерите техния номер.