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

时间:2017-06-06 19:02:38

标签: xslt-1.0

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

喜欢输入 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>

最终输出:

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

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

我的代码如下:

 <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 :(得分: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>