在XSLT 1.0中,对多个节点进行分组并在公共元素下输出可以通过使用<xsl:key>
元素来定义键值,并结合<xsl:for-each>
和<xsl:sort>
元素来实现。以下是一个示例,展示如何对XML文档中的多个节点进行分组并在公共元素下输出。
假设我们有以下XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<items>
<item category="A">
<name>Item 1</name>
</item>
<item category="B">
<name>Item 2</name>
</item>
<item category="A">
<name>Item 3</name>
</item>
<item category="C">
<name>Item 4</name>
</item>
<item category="B">
<name>Item 5</name>
</item>
</items>
我们希望将这些<item>
元素按category
属性进行分组,并在每个类别下输出所有项目名称。以下是相应的XSLT 1.0样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 定义键值 -->
<xsl:key name="items-by-category" match="item" use="@category"/>
<!-- 模板匹配根节点 -->
<xsl:template match="/">
<categories>
<!-- 对类别进行排序 -->
<xsl:for-each select="items/item[generate-id() = generate-id(key('items-by-category', @category)[1])]">
<xsl:sort select="@category"/>
<category>
<xsl:value-of select="@category"/>
<items>
<!-- 输出同一类别的所有项目 -->
<xsl:for-each select="key('items-by-category', @category)">
<item>
<xsl:value-of select="name"/>
</item>
</xsl:for-each>
</items>
</category>
</xsl:for-each>
</categories>
</xsl:template>
</xsl:stylesheet>
category
属性对<item>
元素进行分组。generate-id()
函数用于生成唯一标识符,generate-id(key('items-by-category', @category)[1])
用于获取每个类别的第一个元素的唯一标识符。<xsl:for-each>
循环遍历每个类别的第一个元素,并对其进行排序。<xsl:for-each>
循环遍历同一类别的所有元素,并输出它们的名称。<?xml version="1.0" encoding="UTF-8"?>
<categories>
<category>A</category>
<items>
<item>Item 1</item>
<item>Item 3</item>
</items>
<category>B</category>
<items>
<item>Item 2</item>
<item>Item 5</item>
</items>
<category>C</category>
<items>
<item>Item 4</item>
</items>
</categories>
通过这种方式,你可以在XSLT 1.0中对多个节点进行分组并在公共元素下输出。
领取专属 10元无门槛券
手把手带您无忧上云