我必须根据属性在同一个xml结构中重新组合xml元素 我有一个像这样的xml
<a>
<b>
<c>
<d1 att2="t1">test 1</d1>
<d1>test 2</d1>
<d1>test 3</d1>
<d1 att2="t1">test 4</d1>
</c>
</b>
</a>
我需要将这个xml转换为
<a>
<b>
<c>
<d1 att2="t1">test 1</d1>
<d1 att2="t1">test 4</d1>
</c>
</b>
</a>
<a>
<b>
<c>
<d1>test 2</d1>
</c>
</b>
</a>
<a>
<b>
<c>
<d1>test 3</d1>
</c>
</b>
</a>
答案 0 :(得分:0)
这是一个非常缺乏灵感/手动的努力,但似乎完成了工作。该模板将单独的分支应用于具有和不具有@att2
属性的元素。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<root>
<xsl:for-each-group select="//d1[@att2]" group-by="@att2">
<a>
<b>
<c>
<xsl:for-each select="current-group()">
<xsl:apply-templates select="." mode="nowrapper"></xsl:apply-templates>
</xsl:for-each>
</c>
</b>
</a>
</xsl:for-each-group>
<xsl:apply-templates select="//d1[not(@att2)]" mode="wrapper" />
</root>
</xsl:template>
<xsl:template match="d1" mode="wrapper">
<a>
<b>
<c>
<xsl:apply-templates select="." mode="nowrapper" />
</c>
</b>
</a>
</xsl:template>
<xsl:template match="d1" mode="nowrapper">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>