XSLT - 重命名和移动元素到一个新的节点
问题描述:
我有下面的XML输入文件:XSLT - 重命名和移动元素到一个新的节点
<home>
<folders>
<folder uuid="uuid1">
<name>folder1</name>
<member ref="refA" />
<member ref="refB" />
</folder>
<folder uuid="uuid2">
<name>folder2</name>
<member ref="refC" />
<member ref="refD" />
</folder>
<folder uuid="uuid3">
<name>folder3</name>
<member ref="refE" />
<member ref="refF" />
</folder>
</folders>
</home>
而且我有以下三种:
<home>
<folders>
<folder uuid="uuid1">
<name>folder1</name>
<refNews>
<refNew ref="refA" />
<refNew ref="refB" />
</refNews>
</folder>
<folder uuid="uuid2">
<name>folder2</name>
<refNews>
<refNew ref="refC" />
<refNew ref="refD" />
</refNews>
</folder>
<folder uuid="uuid3">
<name>folder3</name>
<refNews>
<refNew ref="refE" />
<refNew ref="refF" />
</refNews>
</folder>
</folders>
</home>
要恢复:
- “成员”元素变成“refNew”
- 所有“refNew”元素都包含在新节点中“refNews”
我尝试几种XSLT模板,但我不能重新命名,并在同一个XSLT文件移动:-(
我需要你的帮助,谢谢。
问候, Zido
答
它总是更好地看到你有什么到目前为止并帮助解决地方它会错,但其实这是很容易的。试试这个:
<xsl:template match="folder">
<xsl:copy>
<xsl:apply-templates select="@* | node()[not(self::member)]"/>
<refNews>
<xsl:apply-templates select="member"/>
</refNews>
</xsl:copy>
</xsl:template>
<xsl:template match="member">
<refNew>
<xsl:apply-templates select="@* | node()"/>
</refNew>
</xsl:template>
如果你不想refNews
元素,如果没有任何member
S,你可以只包住refNews
元素<xsl:if test="member"/>
,或者更好的,有第一个模板匹配folder[member]
。
这假定您也有定义的身份模板。
+0
感谢Flynn,它完美运行。我明白我的错误:匹配“成员”,我一直在寻找refNews节点,但在第二个模板(match =“member”)中,refNews是未知的! – zido71
我们希望您展示您的努力以获得帮助,我们通常不会从头开始写点东西。请显示您尝试过的xslt,并描述与您所需输出的不同之处 - 在我忘记之前,请通过编辑问题来完成,不要在此处留言中添加此信息 –