我有一块XML要用XSLT进行转换(使用xsltproc - 所以只有XSLT 1.0)。原始XML使用一些标记作为分隔符,如下所示:
<container>
<element />
<element />
<separator />
<element />
<element />
<element />
<separator />
<element />
</container>
我需要将其转换为包含这些元素的格式。所以我需要它看起来像这样:
<container>
<wrapper>
<element />
<element />
</wrapper>
<wrapper>
<element />
<element />
<element />
</wrapper>
<wrapper>
<element />
</wrapper>
</container>
我似乎无法设计出实现此目的的模板。那里有人有什么想法吗?
答案 0 :(得分:6)
此转化:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kFollowing" match="element"
use="generate-id(preceding-sibling::separator[1])"/>
<xsl:template match="/*">
<container>
<xsl:apply-templates select=
"element
[generate-id()
=
generate-id(key('kFollowing',
generate-id(preceding-sibling::separator[1])
)[1]
)
]"/>
</container>
</xsl:template>
<xsl:template match="element">
<wrapper>
<xsl:copy-of select=
"key('kFollowing',
generate-id(preceding-sibling::separator[1])
)"/>
</wrapper>
</xsl:template>
</xsl:stylesheet>
应用于提供的XML文档时:
<container>
<element />
<element />
<separator />
<element />
<element />
<element />
<separator />
<element />
</container>
生成想要的正确结果:
<container>
<wrapper>
<element/>
<element/>
</wrapper>
<wrapper>
<element/>
<element/>
<element/>
</wrapper>
<wrapper>
<element/>
</wrapper>
</container>