您是否有人知道xsl将转换此XML的样子。在pid之后可以有N nte,在pv1之后可以有N nte。保证结构是pid后面的所有nte都属于pid,pv1之后的所有nte都属于pv1。
自:
<pid>
</pid>
<nte>
<nte-1>1</nte-1>
<nte-3>Note 1</nte-1>
</nte>
<nte></nte>
<pv1></pv1>
<nte>
</nte>
进入:
<pid>
<nte>
<nte-1>1</nte-1>
<nte-3>Note 1</nte-1>
</nte>
<nte>
</nte>
</pid>
<pv1>
<nte>
</nte>
</pv1>
谢谢!
答案 0 :(得分:3)
此转化:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kLogicalChildren" match="nte"
use="generate-id(preceding-sibling::*
[self::pid or self::pv1]
[1])"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="pid|pv1">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:copy-of select=
"key('kLogicalChildren', generate-id())"/>
</xsl:copy>
</xsl:template>
<xsl:template match="nte"/>
</xsl:stylesheet>
应用于提供的XML文档(更正格式正确):
<t>
<pid></pid>
<nte>
<nte-1>1</nte-1>
<nte-3>Note 1</nte-3>
</nte>
<nte></nte>
<pv1></pv1>
<nte></nte>
</t>
生成想要的正确结果:
<t>
<pid>
<nte>
<nte-1>1</nte-1>
<nte-3>Note 1</nte-3>
</nte>
<nte/>
</pid>
<pv1>
<nte/>
</pv1>
</t>