XSL XML分组优化:按SuperParent分组并调整节点层级结构
解决方案
要实现你想要的分组结构,我们需要在分组后区分两种元素:SuperParent与Id值相同的主元素,以及同组内的其他子元素,分别处理它们的输出格式。以下是修改后的XSLT代码:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:key name="groupBySuperParent" match="Element" use="SuperParent"/> <!-- 匹配根节点,输出外层ElementList --> <xsl:template match="/*"> <ElementList> <xsl:apply-templates select="ElementList/Element[generate-id()=generate-id(key('groupBySuperParent',SuperParent)[1])]"/> </ElementList> </xsl:template> <!-- 处理每个分组的主节点 --> <xsl:template match="Element"> <superparent id="{SuperParent}"> <!-- 输出当前分组中SuperParent与Id相等的元素的所有子节点 --> <xsl:copy-of select="key('groupBySuperParent',SuperParent)[SuperParent=Id]/*"/> <!-- 处理同组内其他元素,转为element节点并排除Date --> <xsl:for-each select="key('groupBySuperParent',SuperParent)[not(SuperParent=Id)]"> <element> <xsl:copy-of select="SuperParent | Id | Status"/> </element> </xsl:for-each> </superparent> </xsl:template> <!-- 抑制默认的Element节点输出 --> <xsl:template match="Element"/> </xsl:stylesheet>
关键修改说明:
- 根节点模板优化:直接选择分组的第一个元素进行处理,避免多余的模板匹配。
- 分组内元素区分处理:
- 首先通过
key('groupBySuperParent',SuperParent)[SuperParent=Id]筛选出组内的主元素,直接复制它的所有子节点到<superparent>节点下。 - 然后通过
[not(SuperParent=Id)]筛选出同组的其他元素,将它们包装为<element>节点,并且只复制SuperParent、Id、Status节点(排除Date)。
- 首先通过
- 抑制默认输出:最后一个模板用来阻止原始的
<Element>节点被默认输出,确保只有我们自定义的结构被生成。
用这个XSLT处理你的输入XML,就能得到你期望的输出结果啦。
内容的提问来源于stack exchange,提问作者Lenka
相关产品推荐
相关产品推荐

