1 xslt
我有一个xml需要按类别分组我尝试使用
<xsl:for-each-group select="ItemList/Item" group-by="CategoryID">
Run Code Online (Sandbox Code Playgroud)
如何在转换期间获取CategoryName,CategoryID或与Category相关的任何信息?
原始XML
<ItemList>
<Item>
<CategoryID>1</CategoryID>
<CategoryName>Book</CategoryName>
<ItemName>ASP.NET</ItemName>
<ItemDetails>ASP.NET12345</ItemDetails>
</Item>
<Item>
<CategoryID>1</CategoryID>
<CategoryName>Book</CategoryName>
<ItemName>PHP</ItemName>
<ItemDetails>PHP12345</ItemDetails>
</Item>
<Item>
<CategoryID>2</CategoryID>
<CategoryName>Tool</CategoryName>
<ItemName>ToolAbcde</ItemName>
<ItemDetails>sth details</ItemDetails>
</Item></ItemList>
Run Code Online (Sandbox Code Playgroud)
新的XML
<NewXML>
<Category>
<CategoryID>1</CategoryID>
<CategoryName>Book</CategoryName>
<ItemList>
<Item>
<ItemName>ASP.NET</ItemName>
<ItemDetails>ASP.NET12345</ItemDetails>
</Item>
<Item>
<ItemName>PHP</ItemName>
<ItemDetails>PHP12345</ItemDetails>
</Item>
<ItemName>PHP</ItemName>
</ItemList>
</Category>
<Category>
<CategoryID>2</CategoryID>
<CategoryName>Tool</CategoryName>
<ItemList>
<Item>
<ItemName>ToolAbcde</ItemName>
<ItemDetails>sth details</ItemDetails>
</Item>
</ItemList>
</Category></NewXML>
Run Code Online (Sandbox Code Playgroud)
xslt规范对分组有大量的分类,并在http://www.w3.org/TR/xslt20/#xsl-for-each-group上提供了示例.你可能正在寻找current-group()和current-grouping-key()功能.也
在序列构造函数中,上下文项是相关组的初始项,上下文位置是按照组的处理顺序排列的初始项序列(每个组中的一个项)中该项的位置,上下文大小是组的数量,当前组是正在处理的组,当前分组键是该组的分组键.
这意味着这两个表达式在xsl:for-each-group中是等价的:CategoryId和current-group()[1]/CategoryId.由于CategoryId是分组键,因此它也是相同的current-grouping-key().以下是您的用例的完整示例:
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<xsl:template match="/">
<NewXml>
<xsl:for-each-group select="ItemList/Item" group-by="CategoryID">
<Category>
<CategoryID><xsl:value-of select="CategoryID" /></CategoryID>
<CategoryName><xsl:value-of select="CategoryName" /></CategoryName>
<ItemList>
<xsl:for-each select="current-group()">
<Item>
<ItemName><xsl:value-of select="ItemName" /></ItemName>
<ItemDetails><xsl:value-of select="ItemDetails" /></ItemDetails>
</Item>
</xsl:for-each>
</ItemList>
</Category>
</xsl:for-each-group>
</NewXml>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)