在 XSLT 中的每个父节点下分组子节点
Grouping Child nodes under each Parent nodes in XSLT
我不熟悉 XSLT 分组概念。我正在尝试使用 XSLT 2.0 对以下 XML 进行分组。
<Root>
<Entry>
<Split>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
</Split>
<Split>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
</Split>
<Split>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
</Split>
</Entry>
</Root>
下面是我的预期输出。
<Root>
<Entry>
<Split>
<New_Tag>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
</New_Tag>
<New_Tag>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
</New_Tag>
</Split>
<Split>
<New_Tag>
<Data>
<Num>21</Num>
<Type>A</Type>
</Data>
<Data>
<Num>21</Num>
<Type>A</Type>
</Data>
</New_Tag>
</Split>
</Entry>
</Root>
如果它在 XSLT 2.0 中具有相同的 'Num' 值,我想将“Split”下的 'Data' 标签分组为 'New_Tag'。会有更多的报告条目。
请帮我解决这个问题。
有蚂蚁方法吗?
提前致谢。
您可以按 Data/Num
对 Split
元素进行分组并重命名 Split
的元素
至 New_Tag
.
示例...
XML 输入
<Root>
<Entry>
<Split>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
</Split>
<Split>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
</Split>
<Split>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
</Split>
</Entry>
</Root>
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="Entry">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each-group select="Split" group-by="Data/Num">
<xsl:copy>
<xsl:apply-templates select="current-group()"/>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="Split">
<New_Tag>
<xsl:apply-templates select="@*|node()"/>
</New_Tag>
</xsl:template>
</xsl:stylesheet>
XML输出
<Root>
<Entry>
<Split>
<New_Tag>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
</New_Tag>
<New_Tag>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
</New_Tag>
</Split>
<Split>
<New_Tag>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
</New_Tag>
</Split>
</Entry>
</Root>
我不熟悉 XSLT 分组概念。我正在尝试使用 XSLT 2.0 对以下 XML 进行分组。
<Root>
<Entry>
<Split>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
</Split>
<Split>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
</Split>
<Split>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
</Split>
</Entry>
</Root>
下面是我的预期输出。
<Root>
<Entry>
<Split>
<New_Tag>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
</New_Tag>
<New_Tag>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
</New_Tag>
</Split>
<Split>
<New_Tag>
<Data>
<Num>21</Num>
<Type>A</Type>
</Data>
<Data>
<Num>21</Num>
<Type>A</Type>
</Data>
</New_Tag>
</Split>
</Entry>
</Root>
如果它在 XSLT 2.0 中具有相同的 'Num' 值,我想将“Split”下的 'Data' 标签分组为 'New_Tag'。会有更多的报告条目。 请帮我解决这个问题。
有蚂蚁方法吗?
提前致谢。
您可以按 Data/Num
对 Split
元素进行分组并重命名 Split
的元素
至 New_Tag
.
示例...
XML 输入
<Root>
<Entry>
<Split>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
</Split>
<Split>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
</Split>
<Split>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
</Split>
</Entry>
</Root>
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="Entry">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each-group select="Split" group-by="Data/Num">
<xsl:copy>
<xsl:apply-templates select="current-group()"/>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="Split">
<New_Tag>
<xsl:apply-templates select="@*|node()"/>
</New_Tag>
</xsl:template>
</xsl:stylesheet>
XML输出
<Root>
<Entry>
<Split>
<New_Tag>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
<Data>
<Num>20</Num>
<Type>A</Type>
</Data>
</New_Tag>
<New_Tag>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
<Data>
<Num>20</Num>
<Type>B</Type>
</Data>
</New_Tag>
</Split>
<Split>
<New_Tag>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
<Data>
<Num>21</Num>
<Type>C</Type>
</Data>
</New_Tag>
</Split>
</Entry>
</Root>