如何使用XSL将XML的单个元素移动到另一个元素中

时间:2016-08-08 09:41:51

标签: xml xslt

我想将元素id移动到Here我的输入xml是

<COLLECTION>
<abc>
<id>1234</id>
</abc>

        <AddedParts NAME="AddedParts" TYPE="Unknown" STATUS="0">
            <Part>
            </Part>
            <Here>
            </Here>
        </AddedParts>
</COLLECTION>

预期输出

<COLLECTION>
<abc>

</abc>

        <AddedParts NAME="AddedParts" TYPE="Unknown" STATUS="0">
            <Part>
            </Part>
            <Here>
            <id>1234</id>
            </Here>
        </AddedParts>
</COLLECTION>

我写的xsl是

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

     <xsl:output omit-xml-declaration="yes"/>

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



        <xsl:template match= "Here" >
        <xsl:copy>
            <xsl:apply-templates select= "node()|@*" />
            <!-- move nodes to here -->
            <xsl:apply-templates select= "../id " mode= "move" />
        </xsl:copy>
    </xsl:template >
< xsl:template match= "id" />

我无法达到预期的输出

1 个答案:

答案 0 :(得分:0)

您当前的XSLT有两个问题

  1. 您正在尝试选择../id,但id不是当前父级的子级,而是当前父级下的abc元素的子级。它应该是../../abc/id
  2. 您正在应用模式为&#34;移动&#34;但是没有与该模式匹配的模板,这意味着将使用XSLT的内置模板,它将输出id的文本内容,但不输出元素本身。
  3. 试试这个XSLT

    <xsl:stylesheet version="1.0"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <xsl:output method= "xml" version= "1.0" encoding= "UTF-8" indent= "yes" />
        <xsl:strip-space elements= "*" />
    
         <xsl:output omit-xml-declaration="yes"/>
    
            <xsl:template match="node()|@*" name="identity">
              <xsl:copy>
                 <xsl:apply-templates select="node()|@*"/>
              </xsl:copy>
            </xsl:template>
    
            <xsl:template match="Here" >
            <xsl:copy>
                <xsl:apply-templates select= "node()|@*" />
                <!-- move nodes to here -->
                <xsl:apply-templates select= "../../abc/id" mode="move" />
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match= "id" />
    
        <xsl:template match="id" mode="move">
            <xsl:call-template name="identity" />
        </xsl:template>
    </xsl:stylesheet>
    

    如果您不想以任何方式尝试转换id,可以将其简化为此...

    <xsl:stylesheet version="1.0"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
         <xsl:output method= "xml" version= "1.0" encoding= "UTF-8" indent= "yes" />
        <xsl:strip-space elements= "*" />
    
         <xsl:output omit-xml-declaration="yes"/>
    
            <xsl:template match="node()|@*" name="identity">
              <xsl:copy>
                 <xsl:apply-templates select="node()|@*"/>
              </xsl:copy>
            </xsl:template>
    
            <xsl:template match="Here" >
            <xsl:copy>
                <xsl:apply-templates select= "node()|@*" />
                <!-- move nodes to here -->
                <xsl:copy-of select= "../../abc/id"  />
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match= "id" />
    </xsl:stylesheet>