如何使用 Muenchian 分组 XSLT 1.0 按标题对每个目录进行分组
How to group by Title within for each catalog using Muenchian grouping XSLT 1.0
我想编写一些代码以在其每个单独的 CATALOG 标记中基于 TITLE 进行分组。我正在使用 XSLT 1.0 版本。
<?xml version="1.0" encoding="UTF-8"?>
<hello>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>2000</year>
</cd>
<cd>
<title>Unchain my heart</title>
<artist>Joe Cocker</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
</catalog>
<catalog>
<cd>
<title>Ring My Bells</title>
<artist>Enrique</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
</catalog>
</hello>
预期输出:
<Song>
<Desc>From First Catalog</Desc>
<nameofAlbum>Empire Burlesque</nameofAlbum>
<nameofAlbum>Unchain my heart</nameofAlbum>
</Song>
<Song>
<Desc>From Second Catalog</Desc>
<nameofAlbum>Ring My Bells</nameofAlbum>
<nameofAlbum>Empire Burlesque</nameofAlbum>
</Song>
要求仅根据每个 CatLog 的标题进行分组。
我尝试过使用 Muenchian 分组,但它是根据我需要的所有目录标签进行分组的,因为我需要在目录之间进行独立分组。
由于您想在 catalog
中进行重复数据删除,我会使用 generate-id()
并使用为目录元素生成的 ID 和 cd/title
.[=19 创建一个复合键=]
为 cd
上的 xsl:key
匹配使用该复合键,然后您可以遍历每个 /hello/catalog
,然后遍历 catalog
下的每个 cd
] 你可以使用 Muenchian 分组的键:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:variable name="labels">
<label>First</label>
<label>Second</label>
</xsl:variable>
<xsl:key name="cd-by-catalog-and-title" match="cd" use="concat(generate-id(..), title)"/>
<xsl:template match="/">
<xsl:for-each select="/hello/catalog">
<xsl:variable name="pos" select="position()"/>
<Song>
<Desc>From <xsl:value-of select="document('')/xsl:stylesheet/xsl:variable[@name='labels']/label[$pos]"/> Catalog</Desc>
<xsl:for-each select="cd[count(. | key('cd-by-catalog-and-title', concat(generate-id(..), title))[1]) = 1]">
<nameofAlbum><xsl:value-of select="title"/></nameofAlbum>
</xsl:for-each>
</Song>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
我想编写一些代码以在其每个单独的 CATALOG 标记中基于 TITLE 进行分组。我正在使用 XSLT 1.0 版本。
<?xml version="1.0" encoding="UTF-8"?>
<hello>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>2000</year>
</cd>
<cd>
<title>Unchain my heart</title>
<artist>Joe Cocker</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
</catalog>
<catalog>
<cd>
<title>Ring My Bells</title>
<artist>Enrique</artist>
<country>USA</country>
<company>EMI</company>
<price>8.20</price>
<year>1987</year>
</cd>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
</catalog>
</hello>
预期输出:
<Song>
<Desc>From First Catalog</Desc>
<nameofAlbum>Empire Burlesque</nameofAlbum>
<nameofAlbum>Unchain my heart</nameofAlbum>
</Song>
<Song>
<Desc>From Second Catalog</Desc>
<nameofAlbum>Ring My Bells</nameofAlbum>
<nameofAlbum>Empire Burlesque</nameofAlbum>
</Song>
要求仅根据每个 CatLog 的标题进行分组。
我尝试过使用 Muenchian 分组,但它是根据我需要的所有目录标签进行分组的,因为我需要在目录之间进行独立分组。
由于您想在 catalog
中进行重复数据删除,我会使用 generate-id()
并使用为目录元素生成的 ID 和 cd/title
.[=19 创建一个复合键=]
为 cd
上的 xsl:key
匹配使用该复合键,然后您可以遍历每个 /hello/catalog
,然后遍历 catalog
下的每个 cd
] 你可以使用 Muenchian 分组的键:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<xsl:variable name="labels">
<label>First</label>
<label>Second</label>
</xsl:variable>
<xsl:key name="cd-by-catalog-and-title" match="cd" use="concat(generate-id(..), title)"/>
<xsl:template match="/">
<xsl:for-each select="/hello/catalog">
<xsl:variable name="pos" select="position()"/>
<Song>
<Desc>From <xsl:value-of select="document('')/xsl:stylesheet/xsl:variable[@name='labels']/label[$pos]"/> Catalog</Desc>
<xsl:for-each select="cd[count(. | key('cd-by-catalog-and-title', concat(generate-id(..), title))[1]) = 1]">
<nameofAlbum><xsl:value-of select="title"/></nameofAlbum>
</xsl:for-each>
</Song>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>