我正在尝试根据语言对所有类似记录进行分组。但我无法在XSLT中进行分组。 我在XSLT中使用XSL KEY功能组记录。我正在尝试循环并将每个组记录添加到一个组中。
我有以下输入xml。
<root>
<element name="David" language="German"></element>
<element name="Sarah" language="German"></element>
<element name="Isaac" language="English"></element>
<element name="Abraham" language="German"></element>
<element name="Jackson" language="English"></element>
<element name="Deweher" language="English"></element>
<element name="Jonathan" language="Hindi"></element>
<element name="Mike" language="Hindi"></element>
</root>
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="1.0">
<xsl:key name="lang" match="element" use="@language"></xsl:key>
<xsl:template match="/">
<root>
<xsl:for-each select="key('lang',//element/@language)">
<Group>
<xsl:attribute name="name" select=".//@language"></xsl:attribute>
<member><xsl:value-of select=".//@name"/></member>
</Group>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
预期产出:
<root>
<Group name="German">
<member>David</member>
<member>Sarah</member>
<member>Abraham</member>
</Group>
<Group name="English">
<member>Isaac</member>
<member>Jackson</member>
<member>Deweher</member>
</Group>
<Group name="Hindi">
<member>Jonathan</member>
<member>Mike</member>
</Group>
</root>
实际输出:
<root>
<Group name="German">
<member>David</member>
</Group>
<Group name="German">
<member>Sarah</member>
</Group>
<Group name="English">
<member>Isaac</member>
</Group>
<Group name="German">
<member>Abraham</member>
</Group>
<Group name="English">
<member>Jackson</member>
</Group>
<Group name="English">
<member>Deweher</member>
</Group>
<Group name="Hindi">
<member>Jonathan</member>
</Group>
<Group name="Hindi">
<member>Mike</member>
</Group>
</root>
我分别得到每个记录。 有人可以让我知道XSL出了什么问题。谢谢:)
答案 0 :(得分:2)
我在样式表中做了一些更改。这应该达到你期望的结果:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="lang" match="element" use="@language"></xsl:key>
<xsl:template match="root">
<xsl:copy>
<xsl:for-each select="element[count(. | key('lang', @language)[1]) = 1]">
<Group name="{@language}">
<xsl:for-each select="key('lang', @language)">
<member><xsl:value-of select="@name"/></member>
</xsl:for-each>
</Group>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
第一个循环选择每个唯一语言(大小为3的节点集),并为内循环创建上下文。内部循环遍历每个元素,只选择具有相同语言的元素。
Muenchian分组似乎很难掌握,但您始终可以应用 this tutorial 中显示的模板,而不必多想。我只是将该模板应用到您的示例中。
更新:以下是使用for-each
循环 的解决方案:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="lang" match="element" use="@language"></xsl:key>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="element[generate-id(.) = generate-id(key('lang', @language)[1])]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="element">
<Group name="{@language}">
<xsl:apply-templates select="key('lang', @language)" mode="member"/>
</Group>
</xsl:template>
<xsl:template match="element" mode="member">
<member><xsl:value-of select="@name"/></member>
</xsl:template>
</xsl:stylesheet>