使用XSLT将节点从xml的一个部分移动到另一个部分

时间:2015-02-03 17:24:05

标签: xml xslt

作为我的XSLT学习曲线的一部分。我遇到了以下情况并试图完成它。

我有以下格式的xml。

<parent>
  <A> .. </A>
  <T1>  
  <d1>..</d1>
  <d2>..</d2>

 </T1>
 <T1>
   <d1>..</d1>
   <d2>..</d2>
 </T1>
  ...
 <T1>
   <d1>..</d1>
   <d2>..</d2>
 </T1>

   </parent>

我试图将节点'A'移到T1,T1 ...... T1之下。所以最终输出看起来像这样

 <parent>  
 <T1> 
   <A> .. </A> 
   <d1>..</d1>
   <d2>..</d2>
 </T1>

 <T1>
   <A> .. </A>
   <d1>..</d1>
   <d2>..</d2>
 </T1>
  ...
 <T1>
   <A> .. </A>
   <d1>..</d1>
   <d2>..</d2>
 </T1>
</parent>

以下是我一直在使用的xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"     xmlns:DTCC="http://www.informatica.com/B2B/DTCC/NSCC/2014_03">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="@*|node()" name="identity"> 
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template> 

 <xsl:variable name="submittingHeader">   
         <xsl:copy-of select="./A/*" /> 
    </xsl:variable> 

<xsl:template match="T1" >
 <xsl:value-of select="$submittingHeader"/>    

    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

这里我试图将至少节点A移动到T1以下。如果我得到了,那么我将把每个循环放在匹配的模板T1上。

我看到的输出与输入xml相同。我没有看到节点'A'在'T1'下移动。我想我没有正确复制变量的内容或我错过了什么?任何指导

1 个答案:

答案 0 :(得分:2)

我认为你做得不好:

  • 您的submittingHeader变量未选择A节点(您应该使用//A,因为该变量位于任何模板之外)
  • 您没有忽略输出中的原始A元素
  • 您在复制A
  • 之前尝试复制T1

这应该产生预期的结果:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"     xmlns:DTCC="http://www.informatica.com/B2B/DTCC/NSCC/2014_03">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="@*|node()"> 
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template> 

    <!-- avoid copying A in its original position -->
    <xsl:template match="A"/>

    <xsl:template match="T1" >
        <xsl:copy>
            <!-- copy A inside the copied T1 -->
            <xsl:copy-of select="../A" />   
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>