我发现了关于将节点向上移动到父节点的其他问题,但我错过了将它们向下移动到新创建的节点中的技巧。
给定:
<Villain>
<Name>Dr Evil</Name>
<Age>49</Age>
<Like>Money</Like>
<Like>Sharks</Like>
<Like>Lasers</Like>
</Villain>
我正在尝试使用XSLT将其转换为:
<Villain>
<Name>Dr Evil</Name>
<Age>49</Age>
<Likes>
<Like>Money</Like>
<Like>Sharks</Like>
<Like>Lasers</Like>
</Likes>
</Villain>
换句话说,插入一个新的子节点,并移动它下面所有名为"Like“的子节点。
发布于 2010-09-03 01:03:46
此转换
<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:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Like[1]">
<Likes>
<xsl:apply-templates select="../Like" mode="copy"/>
</Likes>
</xsl:template>
<xsl:template match="*" mode="copy">
<xsl:call-template name="identity"/>
</xsl:template>
<xsl:template match="Like"/>
</xsl:stylesheet>
在所提供的XML文档上应用时的
<Villain>
<Name>Dr Evil</Name>
<Age>49</Age>
<Like>Money</Like>
<Like>Sharks</Like>
<Like>Lasers</Like>
</Villain>
生成所需的、正确的结果
<Villain>
<Name>Dr Evil</Name>
<Age>49</Age>
<Likes>
<Like>Money</Like>
<Like>Sharks</Like>
<Like>Lasers</Like>
</Likes>
</Villain>
注意到
使用和覆盖 identity rule.
https://stackoverflow.com/questions/3632244
复制相似问题