Из следующих данных XML:с помощью генерации-идентификатор() и ключи, чтобы избавиться от повторов в XSLT
<lieferungen>
<artikel id="1111">
<name>apfel</name>
<preis stueckpreis="true">8.97</preis>
<lieferant>Fa. Krause</lieferant>
</artikel>
<artikel id="7866">
<name>Kirschen</name>
<preis stueckpreis="false">10.45</preis>
<lieferant>Fa. Helbig</lieferant>
</artikel>
<artikel id="3526">
<name>apfel</name>
<preis stueckpreis="true">12.67</preis>
<lieferant>Fa. Liebig</lieferant>
</artikel>
<artikel id="7866">
<name>Kirschen</name>
<preis stueckpreis="false">17.67</preis>
<lieferant>Fa. Krause</lieferant>
</artikel>
<artikel id="3526">
<name>apfel</name>
<preis stueckpreis="true">9.54</preis>
<lieferant>Fa. Mertes</lieferant>
</artikel>
<artikel id="7866">
<name>Kirschen</name>
<preis stueckpreis="false">16.45</preis>
<lieferant>Fa. Hoeller</lieferant>
</artikel>
<artikel id="7868">
<name>Kohl</name>
<preis stueckpreis="false">3.20</preis>
<lieferant>Fa. Hoeller</lieferant>
</artikel>
<artikel id="7866">
<name>Kirschen</name>
<preis stueckpreis="false">12.45</preis>
<lieferant>Fa. Richard</lieferant>
</artikel>
<artikel id="3245">
<name>Bananen</name>
<preis stueckpreis="false">15.67</preis>
<lieferant>Fa. Hoeller</lieferant>
</artikel>
<artikel id="6745">
<name>Kohl</name>
<preis stueckpreis="false">3.10</preis>
<lieferant>Fa. Reinhardt</lieferant>
</artikel>
<artikel id="7789">
<name>Ananas</name>
<preis stueckpreis="true">8.60</preis>
<lieferant>Fa. Richard</lieferant>
</artikel>
</lieferungen>
Я хочу, чтобы создать следующий вывод через XSLT:
Fa. Helbig supplies: Kirschen
Fa. Liebig supplies: apfel
Fa. Krause supplies: apfel Kirschen
Fa. Mertes supplies: apfel
Fa. Hoeller supplies: Kirschen Kohl Bananen
Fa. Reinhardt supplies: Kohl
Fa. Richard supplies: Kirschen Ananas
С этой целью я написал следующий код xslt:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:template match="lieferungen">
<html>
<head>
<title>
<xsl:text>Lieferanten</xsl:text>
</title>
</head>
<body bgcolor="#ffffff">
<h1>
<xsl:text>Suppliers</xsl:text>
</h1>
<hr/>
<xsl:apply-templates select="//lieferant"></xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="lieferant">
<p>
<xsl:value-of select="text()"/>
<xsl:text> supplies: </xsl:text>
<xsl:for-each select="//artikel[lieferant/text() = current()/text()]">
<xsl:value-of select="name/text()"/>
<xsl:text></xsl:text>
</xsl:for-each>
</p>
</xsl:template>
</xsl:stylesheet>
Это дает мне f ollowing выход:
Fa. Krause supplies: apfelKirschen
Fa. Helbig supplies: Kirschen
Fa. Liebig supplies: apfel
Fa. Krause supplies: apfelKirschen
Fa. Mertes supplies: apfel
Fa. Hoeller supplies: KirschenKohlBananen
Fa. Hoeller supplies: KirschenKohlBananen
Fa. Richard supplies: KirschenAnanas
Fa. Hoeller supplies: KirschenKohlBananen
Fa. Reinhardt supplies: Kohl
Fa. Richard supplies: KirschenAnanas
Для того, чтобы избавиться от повторений, я изменил XSLT-кода следующим образом (обратите внимание на комментарии, обозначающие две линии, которые были изменены/добавлены):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<!--THE FOLLOWING LINE OF CODE WAS ADDED (CHANGE 1/2): -->
<xsl:key name="suppliers" match="lieferant" use="lieferant" />
<xsl:template match="lieferungen">
<html>
<head>
<title>
<xsl:text>Lieferanten</xsl:text>
</title>
</head>
<body bgcolor="#ffffff">
<h1>
<xsl:text>Suppliers</xsl:text>
</h1>
<hr/>
<!--THE FOLLOWING LINE OF CODE WAS MODIFIED (CHANGE 2/2):-->
<xsl:apply-templates select="//lieferant[generate-id()=generate-id(key('suppliers', lieferant)[1])]"></xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="lieferant">
<p>
<xsl:value-of select="text()"/>
<xsl:text> supplies: </xsl:text>
<xsl:for-each select="//artikel[lieferant/text() = current()/text()]">
<xsl:value-of select="name/text()"/>
<xsl:text></xsl:text>
</xsl:for-each>
</p>
</xsl:template>
</xsl:stylesheet>
Однако , это нарушило код. Что не так с кодом, который я использовал?
Если (как это кажется), вы» используя XSLT 2.0, почему вы пытаетесь использовать группировку Muenchian? XSLT 2.0 имеет встроенные методы как для группировки, так и для получения различных значений. –