当Child为空或缺失时,XSLT映射以删除父元素

时间:2014-05-01 20:28:22

标签: xslt-1.0

如果所有TDLINE标记都为空或不存在,我需要删除E1EDPT1元素。我试过但没有用。

    <E1EDPT1 SEGMENT="">
    <TDID>Z014</TDID>
    <TSSPRAS>EN</TSSPRAS>
   </E1EDPT1>
   <E1EDPT1 SEGMENT="">
    <TDID>Z002</TDID>
    <TSSPRAS>EN</TSSPRAS>
   </E1EDPT1>
   <E1EDPT1 SEGMENT="">
    <TDID>Z012</TDID>
    <TSSPRAS>EN</TSSPRAS>
   </E1EDPT1>
   <E1EDPT1 SEGMENT="">
    <TDID>Z011</TDID>
    <TSSPRAS>EN</TSSPRAS>
    <E1EDPT2 SEGMENT="">
        <TDLINE></TDLINE>
        <TDFORMAT>*</TDFORMAT>
    </E1EDPT2>
    <E1EDPT2 SEGMENT="">
    <TDLINE>Hello</TDLINE>
    <TDFORMAT>*</TDFORMAT>
    </E1EDPT2>
     </E1EDPT1>   

输出应如下所示。

   <E1EDPT1 SEGMENT="">
    <TDID>Z011</TDID>
    <TSSPRAS>EN</TSSPRAS>
    <E1EDPT2 SEGMENT="">
       <TDLINE>Hello</TDLINE>
       <TDFORMAT>*</TDFORMAT>
    </E1EDPT2>
   </E1EDPT1>     

感谢任何帮助。

谢谢, 莫汉

1 个答案:

答案 0 :(得分:0)

根据您所需的输出,我认为如果您的孩子或后代是空的,则无需删除整个E1EDPT1节点。

尝试下面的样式表:

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

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

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

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

    <!-- delete E1EDPT1 node if it has an empty TDLINE child 
        or if it does not have any descendant TDLINE -->
    <xsl:template match="E1EDPT1[TDLINE = '' or (count(descendant::TDLINE[. != '']) = 0)]"/>

    <xsl:template match="E1EDPT2[TDLINE = '' or not(TDLINE)]"/>

</xsl:stylesheet>