导航到嵌套子属性并与另一个元素合并

时间:2015-03-16 11:41:29

标签: xslt

我坚持使用XSLT转换,因为我很新并开始学习。

输入XML

<SHOW_LIST>
<SHOW ID="12345">
    <SHOW_INFO>xxx</SHOW_INFO>
    <SHOW_ELEMENT_LIST>
        <SHOW_ELEMENT ID="1">  
            <SHOW_ELEMENT_LIST>
                <SHOW_ELEMENT ID="12345678"></SHOW_ELEMENT>
            </SHOW_ELEMENT_LIST>
        </SHOW_ELEMENT>
        <SHOW_ELEMENT ID="2">  
            <SHOW_ELEMENT_LIST>
                <SHOW_ELEMENT ID="12345666"></SHOW_ELEMENT>
            </SHOW_ELEMENT_LIST>
        </SHOW_ELEMENT>
    </SHOW_ELEMENT_LIST>
    <SECONDARY_ELEMENT_LIST/>
    <ALTERNATIVE_SHOW_LIST>
        <SHOW ID="54321">
            <SHOW_INFO>xxxa</SHOW_INFO>
            <SHOW_ELEMENT_LIST>
                <SHOW_ELEMENT ID="3">  </SHOW_ELEMENT>
                <SHOW_ELEMENT ID="4">  </SHOW_ELEMENT>
                <SHOW_ELEMENT ID="5">  </SHOW_ELEMENT>
            </SHOW_ELEMENT_LIST>
            <SECONDARY_ELEMENT_LIST/>
        </SHOW>
        <SHOW ID="54322">
            <SHOW_INFO>xxxb</SHOW_INFO>
            <SHOW_ELEMENT_LIST>
                <SHOW_ELEMENT ID="6">  </SHOW_ELEMENT>
                <SHOW_ELEMENT ID="7">  </SHOW_ELEMENT>
            </SHOW_ELEMENT_LIST>
            <SECONDARY_ELEMENT_LIST/>
        </SHOW>
    </ALTERNATIVE_SHOW_LIST>
</SHOW>

OUTPUT XML:

<SHOW_LIST>
    <SHOW ID="12345">
        <SHOW_INFO>xxx</SHOW_INFO>
        <SHOW_ELEMENT_LIST>
            <SHOW_ELEMENT ID="1">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="2">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="3">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="4">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="5">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="6">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="7">  </SHOW_ELEMENT>
        </SHOW_ELEMENT_LIST>
        <SECONDARY_ELEMENT_LIST/>
        <ALTERNATIVE_SHOW_LIST>
            <SHOW ID="54321">
                <SHOW_INFO>xxxa</SHOW_INFO>
                <SECONDARY_ELEMENT_LIST/>
            </SHOW>
            <SHOW ID="54322">
                <SHOW_INFO>xxxb</SHOW_INFO>
                <SECONDARY_ELEMENT_LIST/>
            </SHOW>
        </ALTERNATIVE_SHOW_LIST>
    </SHOW>
</SHOW_LIST>

我能够导航到Alternative_show_list并且无法复制SHOW_ELEMENTS并与主SHOW_ELEMENT_LIST合并。

任何人都帮助我执行此操作

同一输入文件的另一个输出

<SHOW_LIST>
    <SHOW ID="12345">
        <SHOW_INFO>xxx</SHOW_INFO>
        <SHOW_ELEMENT_LIST>
            <SHOW_ELEMENT ID="1">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="2">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="3">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="4">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="5">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="6">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="7">  </SHOW_ELEMENT>
        </SHOW_ELEMENT_LIST>
        <SECONDARY_ELEMENT_LIST/>
     </SHOW>
</SHOW_LIST>

现在我正在尝试这种输出。

新输出XML

<?xml version="1.0" encoding="UTF-8"?>
<SHOW_LIST>
   <SHOW ID="12345">
      <SHOW_INFO>xxx</SHOW_INFO>
      <SHOW_ELEMENT_LIST>
        <SHOW_ELEMENT ID="1">  
                <SHOW_ELEMENT_LIST>
                    <SHOW_ELEMENT ID="12345678"></SHOW_ELEMENT>
                </SHOW_ELEMENT_LIST>
            </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="2">  
                <SHOW_ELEMENT_LIST>
                    <SHOW_ELEMENT ID="12345666"></SHOW_ELEMENT>
                </SHOW_ELEMENT_LIST>
            </SHOW_ELEMENT>
         <SHOW_ELEMENT ID="3"/>
         <SHOW_ELEMENT ID="4"/>
         <SHOW_ELEMENT ID="5"/>
         <SHOW_ELEMENT ID="6"/>
         <SHOW_ELEMENT ID="7"/>
      </SHOW_ELEMENT_LIST>
      <SECONDARY_ELEMENT_LIST/>
    </SHOW>
</SHOW_LIST>

2 个答案:

答案 0 :(得分:0)

这个简单的样式表可以解决这个问题:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

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

    <!-- get all the SHOW_ELEMENT nodes -->
    <xsl:template match="SHOW//SHOW_ELEMENT_LIST[not(ancestor::ALTERNATIVE_SHOW_LIST)]">
        <SHOW_ELEMENT_LIST>
            <xsl:copy-of select="..//SHOW_ELEMENT"/>
        </SHOW_ELEMENT_LIST>
    </xsl:template>

    <!-- delete all SHOW_ELEMENT_LIST under ALTERNATIVE_SHOW_LIST -->
    <xsl:template match="SHOW//SHOW_ELEMENT_LIST[ancestor::ALTERNATIVE_SHOW_LIST]"/>

</xsl:stylesheet>

答案 1 :(得分:0)

<xsl:template match="ALTERNATIVE_SCHEDULE_LIST"/>

这有助于第二个输出XML删除ATERNATIVE_SCHEDULE_LIST元素。 如果有任何其他解决方案,请纠正我