我的问题是我想将XML中的节点移动到f.eks后面的节点: 我有一个看起来像这样的xml:
<root>
<node>a</node>
<node>b</node>
<node>c</node>
<top1>
<node>d</node>
<node>e</node>
<top2>
</root>
它最终将成为
<root>
<top1>
<node>a</node>
<node>b</node>
<node>c</node>
</top1>
<top2>
<node>d</node>
<node>e</node>
</top2>
</root>
但我没有任何可以做到这一点的xsl。我已经尝试过使用position(),但没有一个让我更接近。 任何人都可以向我展示正确的方法
答案 0 :(得分:0)
这是一个选项:
XML输入(已更正为格式良好)
<root>
<node>a</node>
<node>b</node>
<node>c</node>
<top1/>
<node>d</node>
<node>e</node>
<top2/>
</root>
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:apply-templates select="@*|*[starts-with(name(),'top')]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(name(),'top')]">
<xsl:copy>
<xsl:apply-templates select="@*|preceding-sibling::node[(following-sibling::*[starts-with(name(),'top')])[1][generate-id() = generate-id(current())]]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<强>输出强>
<root>
<top1>
<node>a</node>
<node>b</node>
<node>c</node>
</top1>
<top2>
<node>d</node>
<node>e</node>
</top2>
</root>
答案 1 :(得分:0)
我的输入是这样的: 这不适用于上面的xsl - 它会移除顶部元素中的孩子。
<root>
<node>a</node>
<node>b</node>
<node>c</node>
<top1>
<node>1</node>
<node>2</node>
</top1>
<node>d</node>
<node>e</node>
<top2>
<node>3</node>
<node>4</node>
</top2>
</root>