如何将选定的Xml节点移动到所选节点的最后一个节点。下面是一个示例xml。
<Custom>
<Root name="root1">
<Folder name="Folder1">
<Node name="Sample Node">
<LevelGroup>
<Level name="1">First Level</Level>
<Level name="5">Fifth Level</Level>
</LevelGroup>
</Node>
</Folder>
<Folder name="Folder2">
<Node name="Node A">
<LevelGroup>
<Level name="1">First Level</Level>
<Level name="2">Second Level</Level>
</LevelGroup>
</Node>
<Node name="Node C">
<LevelGroup>
<Level name="4">Fourth Level</Level>
<Level name="5">Fifth Level</Level>
</LevelGroup>
</Node>
</Folder>
</Root>
<Root name="root2">
<Folder name="FolderA">
<Node name="Node X">
<LevelGroup>
<Level name="1">First Level</Level>
</LevelGroup>
</Node>
</Folder>
</Root>
<Root name="root4">
<Folder name="FolderC">
<Node name="Node Z">
<LevelGroup>
<Level name="1">First Level</Level>
</LevelGroup>
</Node>
</Folder>
</Root>
</Custom>
在上面的Xml中,有很多名为“ Root ”和“ Node ”的节点。 “节点”具有名为“名称”的属性。如果name属性值包含字符串“Sample Node”,则必须移动到匹配的“ Node ”的最后一个。我们如何通过xslt实现这一目标。
以下是预期结果:
<Custom>
<Root name="root1">
<Folder name="Folder2">
<Node name="Node A">
<LevelGroup>
<Level name="1">First Level</Level>
<Level name="2">Second Level</Level>
</LevelGroup>
</Node>
<Node name="Node C">
<LevelGroup>
<Level name="4">Fourth Level</Level>
<Level name="5">Fifth Level</Level>
</LevelGroup>
</Node>
</Folder>
<Folder name="Folder1">
<Node name="Sample Node">
<LevelGroup>
<Level name="1">First Level</Level>
<Level name="5">Fifth Level</Level>
</LevelGroup>
</Node>
</Folder>
</Root>
<Root name="root2">
<Folder name="FolderA">
<Node name="Node X">
<LevelGroup>
<Level name="1">First Level</Level>
</LevelGroup>
</Node>
</Folder>
</Root>
<Root name="root4">
<Folder name="FolderC">
<Node name="Node Z">
<LevelGroup>
<Level name="1">First Level</Level>
</LevelGroup>
</Node>
</Folder>
</Root>
</Custom>
的变化必须发生
<Folder name="Folder1">
<Node name="Sample Node">
<LevelGroup>
<Level name="1">First Level</Level>
<Level name="5">Fifth Level</Level>
</LevelGroup>
</Node>
</Folder>
先谢谢。
答案 0 :(得分:1)
您实际想要移动的元素似乎是Folder
而不是Node
无论如何,我认为你基本上要做的就是设置为copy-of
- 行。一个没有你的&#34;样本字符串的所有元素&#34;作为@name
,一个用于。所以,试试下面的代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="Custom">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="Root">
<xsl:copy>
<xsl:for-each select="@*"><xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute></xsl:for-each>
<xsl:copy-of select="Folder[not(descendant::Node[@name='Sample Node'])]"/>
<xsl:copy-of select="Folder[descendant::Node[@name='Sample Node']]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>