我正在尝试处理一个 xml 文件,该文件有几个不同的状态组,例如
<root>
<childgroup>16</childgroup>
<setstate>init</setstate>
<child1>...</child1>
<child2>...</child2>
<setstate>process<setstate>
<child2>...</child2>
<child3>...</child3>
.....
<childgroup>17</childgroup>
...
我需要的是实际上得到类似的东西
<childgroup no="16">
<state statename="init">
<child1>...</child1>
<child2>...</child2>
</state>
<state statename="process">
<child2>...</child2>
<child3>...</child3>
</state>
</childgroup>
<childgroup no="17">
...
以下是如何一步使用 XSLT 1.0 进行分组的示例;样式表
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:key name="k1" match="root/*[not(self::childgroup)]"
use="generate-id(preceding-sibling::childgroup[1])"/>
<xsl:key name="k2" match="root/*[not(self::childgroup) and not(self::setstate)]"
use="concat(generate-id(preceding-sibling::childgroup[1]), '|', generate-id(preceding-sibling::setstate[1]))"/>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="childgroup"/>
</xsl:copy>
</xsl:template>
<xsl:template match="childgroup">
<childgroup no="{.}">
<xsl:apply-templates select="key('k1', generate-id())[self::setstate]"/>
</childgroup>
</xsl:template>
<xsl:template match="setstate">
<state statename="{.}">
<xsl:copy-of select="key('k2', concat(generate-id(preceding-sibling::childgroup[1]), '|', generate-id()))"/>
</state>
</xsl:template>
</xsl:stylesheet>
变换输入样本
<root>
<childgroup>16</childgroup>
<setstate>init</setstate>
<child1>...</child1>
<child2>...</child2>
<setstate>process</setstate>
<child2>...</child2>
<child3>...</child3>
<childgroup>17</childgroup>
<setstate>init</setstate>
<child1>...</child1>
<child2>...</child2>
<setstate>process</setstate>
<child2>...</child2>
<child3>...</child3>
</root>
into
<root>
<childgroup no="16">
<state statename="init">
<child1>...</child1>
<child2>...</child2>
</state>
<state statename="process">
<child2>...</child2>
<child3>...</child3>
</state>
</childgroup>
<childgroup no="17">
<state statename="init">
<child1>...</child1>
<child2>...</child2>
</state>
<state statename="process">
<child2>...</child2>
<child3>...</child3>
</state>
</childgroup>
</root>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)