我正在使用XSLT 2.0来做到这一点我也遇到了类似的问题,但给出的答案都没有正常工作。 Similar One
XML
<Users>
<User id="1" name="TYE" Division="Admin"/>
<User id="2" name="ANN" Division="HR"/>
<User id="3" name="LAR" Division="Marketing"/>
<User id="4" name="JSN" Division="Admin"/>
</Users>
需要这样的输出;
<AllUsers>
<Division value="HR">
<User>
<id>2</id>
<name>TYE</name>
</User>
<User>
<id>5</id>
<name>JSN</name>
</User>
</Division>
<Division value="ADMIN">
<User>
<id>3</id>
<name>ANN</name>
</User>
</Division>
<Division value="Marketing">
<User>
<id>4</id>
<name>LAR</name>
</User>
</Division>
</AllUsers>
需要按部门分组..谢谢。
答案 0 :(得分:2)
这是另一个更像推送风格的选择......
XML输入
<Users>
<User id="1" name="TYE" Division="Admin"/>
<User id="2" name="ANN" Division="HR"/>
<User id="3" name="LAR" Division="Marketing"/>
<User id="4" name="JSN" Division="Admin"/>
</Users>
XSLT 2.0
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<AllUsers>
<xsl:for-each-group select="User" group-by="@Division">
<Division value="{current-grouping-key()}">
<xsl:apply-templates select="current-group()"/>
</Division>
</xsl:for-each-group>
</AllUsers>
</xsl:template>
<xsl:template match="User/@*">
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@Division" priority="1"/>
</xsl:stylesheet>
<强>输出强>
<AllUsers>
<Division value="Admin">
<User>
<id>1</id>
<name>TYE</name>
</User>
<User>
<id>4</id>
<name>JSN</name>
</User>
</Division>
<Division value="HR">
<User>
<id>2</id>
<name>ANN</name>
</User>
</Division>
<Division value="Marketing">
<User>
<id>3</id>
<name>LAR</name>
</User>
</Division>
</AllUsers>
答案 1 :(得分:1)
这就是我要做的,
<?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" omit-xml-declaration="yes" />
<xsl:key name="division" match="User" use="@Division" />
<xsl:template match="Users">
<xsl:element name="AllUsers">
<xsl:for-each-group select="*" group-by="@Division">
<xsl:element name="Division">
<xsl:attribute name="value">
<xsl:value-of select="@Division" />
</xsl:attribute>
<xsl:for-each select="current-group()">
<xsl:element name="User">
<xsl:element name="id">
<xsl:value-of select="@id" />
</xsl:element>
<xsl:element name="name">
<xsl:value-of select="@name" />
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each-group>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
让我知道这是否有效?应该如我所知。