将节点及其子节点移动到同一级别的另一个节点

问题描述 投票:0回答:1

我需要将一个节点及其子元素移动到同一级别的下一个节点。

DSPACCNAME 节点及其子元素应移动到 DSPACCINFO 节点。

下面是我输入的 XML

<ENVELOPE>
 <DSPACCNAME>
  <DSPDISPNAME>Account 1</DSPDISPNAME>
</DSPACCNAME>
 <DSPACCINFO>
  <DSPOPAMT>
   <DSPOPAMTA>-100.14</DSPOPAMTA>
</DSPOPAMT>
  <DSPDRAMT>
   <DSPDRAMTA></DSPDRAMTA>
</DSPDRAMT>
  <DSPCRAMT>
   <DSPCRAMTA></DSPCRAMTA>
</DSPCRAMT>
  <DSPCLAMT>
   <DSPCLAMTA>-100.14</DSPCLAMTA>
</DSPCLAMT>
</DSPACCINFO>
 <DSPACCNAME>
  <DSPDISPNAME>Account 2</DSPDISPNAME>
</DSPACCNAME>
 <DSPACCINFO>
  <DSPOPAMT>
   <DSPOPAMTA></DSPOPAMTA>
</DSPOPAMT>
  <DSPDRAMT>
   <DSPDRAMTA>-470.00</DSPDRAMTA>
</DSPDRAMT>
  <DSPCRAMT>
   <DSPCRAMTA>470.00</DSPCRAMTA>
</DSPCRAMT>
  <DSPCLAMT>
   <DSPCLAMTA></DSPCLAMTA>
</DSPCLAMT>
</DSPACCINFO>
 <DSPACCNAME>
  <DSPDISPNAME>Account 3</DSPDISPNAME>
</DSPACCNAME>
 <DSPACCINFO>
  <DSPOPAMT>
   <DSPOPAMTA>-942.00</DSPOPAMTA>
</DSPOPAMT>
  <DSPDRAMT>
   <DSPDRAMTA>-445.05</DSPDRAMTA>
</DSPDRAMT>
  <DSPCRAMT>
   <DSPCRAMTA>446.00</DSPCRAMTA>
</DSPCRAMT>
  <DSPCLAMT>
   <DSPCLAMTA>941.00</DSPCLAMTA>
</DSPCLAMT>
</DSPACCINFO>
 <DSPACCNAME>
  <DSPDISPNAME>Account 4</DSPDISPNAME>
</DSPACCNAME>
 <DSPACCINFO>
  <DSPOPAMT>
   <DSPOPAMTA></DSPOPAMTA>
</DSPOPAMT>
  <DSPDRAMT>
   <DSPDRAMTA>-830.99</DSPDRAMTA>
</DSPDRAMT>
  <DSPCRAMT>
   <DSPCRAMTA>830.99</DSPCRAMTA>
</DSPCRAMT>
  <DSPCLAMT>
   <DSPCLAMTA></DSPCLAMTA>
</DSPCLAMT>
</DSPACCINFO>
</ENVELOPE> 

下面是我尝试过的XSL

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="DSPACCNAME">
  <xsl:copy>
    <xsl:apply-templates select="node()[not(self::DSPACCNAME)]|@*"/>
  </xsl:copy>
  <!--<xsl:apply-templates select="DSPACCNAME"/>-->
 </xsl:template>
</xsl:stylesheet>

我没有通过上述 XSL 获得预期的输出

我的预期输出如下

<ENVELOPE>
 <DSPACCINFO>
 <DSPACCNAME>
  <DSPDISPNAME>Account 1</DSPDISPNAME>
</DSPACCNAME>
  <DSPOPAMT>
   <DSPOPAMTA>-100.14</DSPOPAMTA>
</DSPOPAMT>
  <DSPDRAMT>
   <DSPDRAMTA></DSPDRAMTA>
</DSPDRAMT>
  <DSPCRAMT>
   <DSPCRAMTA></DSPCRAMTA>
</DSPCRAMT>
  <DSPCLAMT>
   <DSPCLAMTA>-100.14</DSPCLAMTA>
</DSPCLAMT>
</DSPACCINFO>
 <DSPACCINFO>
 <DSPACCNAME>
  <DSPDISPNAME>Account 2</DSPDISPNAME>
</DSPACCNAME>
  <DSPOPAMT>
   <DSPOPAMTA></DSPOPAMTA>
</DSPOPAMT>
  <DSPDRAMT>
   <DSPDRAMTA>-470.00</DSPDRAMTA>
</DSPDRAMT>
  <DSPCRAMT>
   <DSPCRAMTA>470.00</DSPCRAMTA>
</DSPCRAMT>
  <DSPCLAMT>
   <DSPCLAMTA></DSPCLAMTA>
</DSPCLAMT>
</DSPACCINFO>
 <DSPACCINFO>
 <DSPACCNAME>
  <DSPDISPNAME>Account 3</DSPDISPNAME>
</DSPACCNAME>
  <DSPOPAMT>
   <DSPOPAMTA>-942.00</DSPOPAMTA>
</DSPOPAMT>
  <DSPDRAMT>
   <DSPDRAMTA>-445.05</DSPDRAMTA>
</DSPDRAMT>
  <DSPCRAMT>
   <DSPCRAMTA>446.00</DSPCRAMTA>
</DSPCRAMT>
  <DSPCLAMT>
   <DSPCLAMTA>941.00</DSPCLAMTA>
</DSPCLAMT>
</DSPACCINFO>
 <DSPACCINFO>
 <DSPACCNAME>
  <DSPDISPNAME>Account 4</DSPDISPNAME>
</DSPACCNAME>
  <DSPOPAMT>
   <DSPOPAMTA></DSPOPAMTA>
</DSPOPAMT>
  <DSPDRAMT>
   <DSPDRAMTA>-830.99</DSPDRAMTA>
</DSPDRAMT>
  <DSPCRAMT>
   <DSPCRAMTA>830.99</DSPCRAMTA>
</DSPCRAMT>
  <DSPCLAMT>
   <DSPCLAMTA></DSPCLAMTA>
</DSPCLAMT>
</DSPACCINFO>
</ENVELOPE> 


xslt-1.0
1个回答
0
投票

尝试这样:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/ENVELOPE">
    <xsl:copy>
        <xsl:apply-templates select="DSPACCINFO"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="DSPACCINFO">
    <xsl:copy>
        <xsl:copy-of select="preceding-sibling::DSPACCNAME[1]"/>
        <xsl:copy-of select="*"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.