/ / Създайте списък с различни xml елементи и ги пребройте xpath v1.0 - xml, xslt, xpath

Създайте списък с отделни xml елементи и ги бройте xpath v1.0 - xml, xslt, xpath

Използвам 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() можете да намерите техния номер.