我有一个XML文件(连同一个标头)有多个CC节点,每个CC节点具有多个子节点,如下所示:
<File>
<Header/>
<CC>
<Div>
<SubDiv>
<Com>
<Reg>
<CCOrder>
</CC>
<CC>
<Div>
<SubDiv>
<Com>
<Reg>
<CCOrder>
</CC>
<CC>
<Div>
<SubDiv>
<Com>
<Reg>
<CCOrder>
</CC>
<File>
我想重新排列/排序XSLT,以使格式看起来像这样(CC节点中的每个子节点都按升序分组在一起):
<File>
<Header/>
<CCDiv>
<Div1>
<Div2>
<Div3>
</CCDiV>
<CCSubDiv>
<SubDiv1>
<SubDiv2>
<SubDiv3>
</CCSubDiv>
<CCCom>
<Com1>
<Com2>
<Com3>
<File>
,对于Reg和CCOrder节点,依此类推。
有人可以帮忙吗?
答案 0 :(得分:2)
假设XSLT 2或3,您可以使用for-each-group select="CC/*" group-by="node-name(.)"
:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="File">
<xsl:copy>
<xsl:for-each-group select="CC/*" group-by="node-name(.)">
<xsl:element name="{local-name(..)}{current-grouping-key()}">
<xsl:apply-templates select="current-group()"/>
</xsl:element>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="CC/*">
<xsl:element name="{name()}{position()}"></xsl:element>
</xsl:template>
</xsl:stylesheet>