首页 文章

将子节点移动到父节点的条件

提问于
浏览
-1

我有一个xml文件,我需要通过创建一个空的父节点,将具有交易项ID(如 childA )的特定子节点移动/复制到父节点 .

喜欢 Input XML :

<root>
<Payload>
        <TradeItemVersion>
            <TradeItemID>A</TradeItemID>
            <TradeItemTitle>B</TradeItemTitle>
            <ProductID>C</ProductID>
       <TradeItemVersion>  
     <Child>
            <TradeItemID>ChildA</TradeItemID>
            <TradeItemTitle>Child</TradeItemTitle>
            <ProductID>Child</ProductID>
       <Child> 
<Child>
            <TradeItemID>ChildB</TradeItemID>
            <TradeItemTitle>Child</TradeItemTitle>
            <ProductID>Child</ProductID>
       <Child>
<Payload>
<root>

Final Output :

<root>
<Payload>
<TradeItemVersion>
            <TradeItemID>ChildA</TradeItemID>
            <TradeItemTitle>Child</TradeItemTitle>
            <ProductID>Child</ProductID>
       <TradeItemVersion> 
        <TradeItemVersion>
            <TradeItemID>A</TradeItemID>
            <TradeItemTitle>B</TradeItemTitle>
            <ProductID>C</ProductID>
       <TradeItemVersion>  
<Child>
            <TradeItemID>ChildB</TradeItemID>
            <TradeItemTitle>Child</TradeItemTitle>
            <ProductID>Child</ProductID>
       <Child>

<Payload>
<root>

我能够在顶部复制孩子,但所有 childs 都被复制,我无法选择特定的孩子,而且我无法创建新的空父标记以将孩子放入其中 .

我的代码如下:

<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()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="TradeItemVersion">
        <xsl:apply-templates mode="search"/>
        <xsl:call-template name="identity"/>
    </xsl:template>
    <xsl:template match="Child"/>
    <xsl:template match="Child" mode="search">
        <xsl:call-template name="identity"/>
    </xsl:template>
    <xsl:template match="text()" mode="search"/>


</xsl:stylesheet>

请建议 .

1 回答

  • 0

    经过大量的打击和试验后,我自己找到了答案 .

    以下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()|@*" name="identity">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:copy>
        </xsl:template>
        <xsl:template match="TradeItemVersion">
            <xsl:apply-templates mode="search"/>
            <xsl:call-template name="identity"/>
        </xsl:template>
    
    <xsl:template match="Child"/>
        <xsl:template match="Child[contains(TradeItemID,'ChildA')]" mode="search">
            <TradeItemVersion>
    <xsl:call-template name="identity"/>
    </TradeItemVersion>
        </xsl:template>
        <xsl:template match="text()" mode="search"/>
    
    
    </xsl:stylesheet>
    

    输入XML:

    <root>
    <Payload>
            <TradeItemVersion>
                <TradeItemID>A</TradeItemID>
                <TradeItemTitle>B</TradeItemTitle>
                <ProductID>C</ProductID>
    
         <Child>
                <TradeItemID>ChildA</TradeItemID>
                <TradeItemTitle>Child</TradeItemTitle>
                <ProductID>Child</ProductID>
           </Child> 
    <Child>
                <TradeItemID>ChildB</TradeItemID>
                <TradeItemTitle>Child</TradeItemTitle>
                <ProductID>Child</ProductID>
           </Child>
    </TradeItemVersion>
    </Payload>
    </root>
    

    输出XML:

    <root>
      <Payload>
        <TradeItemVersion>
          <Child>
            <TradeItemID>ChildA</TradeItemID>
            <TradeItemTitle>Child</TradeItemTitle>
            <ProductID>Child</ProductID>
          </Child>
        </TradeItemVersion>
        <TradeItemVersion>
          <TradeItemID>A</TradeItemID>
          <TradeItemTitle>B</TradeItemTitle>
          <ProductID>C</ProductID>
        </TradeItemVersion>
      </Payload>
    </root>
    

相关问题