0

我的问题是我想将 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() ,但没有一个能让我更接近。谁能告诉我正确的方法

4

2 回答 2

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>
于 2012-07-12T02:35:48.840 回答
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>
于 2012-07-12T07:11:20.553 回答