从n到m的映射

时间:2012-07-11 19:47:45

标签: xslt nodes

我的问题是我想将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(),但没有一个让我更接近。 任何人都可以向我展示正确的方法

2 个答案:

答案 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>