我发现了有关将节点向上移动到父节点的其他问题,但是我错过了将它们移动到新创建的节点的技巧。
假设:
<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”的子节点。
答案 0 :(得分:4)
此转化:
<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>
请注意:
使用和覆盖身份规则 。
使用模式 指定稍有不同的处理。