除了一些定义显式之外,删除空节点

时间:2015-09-16 14:10:52

标签: xml xslt

我决定开一个新主题,因为在之前我没有准确地定义我期待的内容。 我输入的XML看起来:

    <tag5>
                <addresses/>
                <identifiedBaseServices/>
                <sharedGroups>
                   <names></names>
                   <types></types>
     </tag5>
     <contain>
                <attributes/>
                <addresses/>
                <identifiedBaseServices/>
                <sharedGroups>
                   <names></names>
                   <types></types>
                </sharedGroups>
     </contain>
<smth>
           <tag1></tag1>
               <tag3> TEXT </tag3>
</smth>

我想要的只是删除空节点,除了我明确定义的一些节点。例如,我不想删除

attributes, 

所以xml OUTPUT应该看起来:

 <contain>
            <attributes/>
 </contain>


<smth>
           <tag3> TEXT </tag3>
</smth>

我正在寻找一些解决方案,几个小时之后我得到了像:

<xsl:strip-space elements="*"/>
<xsl:template match="*[descendant::text() or descendant-or-self::*/@*[string()]]">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>   
<xsl:template match="attributes[not(node())]" priority="1">
    <xsl:copy>
        <xsl:apply-templates select="@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="*[not(.//text() | .//@*)]"/>

</xsl:stylesheet>

它的工作原理几乎没有,但是如果是这样的话。包含一些数据。当所有内容都为null时,该XSL代码将删除所有空标记...

这里有人可以帮助我吗?提前谢谢..

1 个答案:

答案 0 :(得分:1)

我认为这就是你想要的:

<?xml version="1.0" encoding="UTF-8" ?>
<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:template match="*[.//attributes] | attributes">
        <xsl:element name="{local-name()}">
            <xsl:apply-templates />        
        </xsl:element>
    </xsl:template>

    <xsl:template match="*[descendant::text() or descendant-or-self::*/@*[string()]]">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>  

</xsl:stylesheet>

我已删除了您的文字模板 - 它正在删除您要保留的空节点。相反,我们有一个模板来匹配任何具有attributes作为子节点或attributes节点本身的节点。然后我们保留该标签并忽略其余的孩子。如果你想将这些属性保存在attributes节点上,我认为这不会处理属性(XML属性)。

采取此文件:

<rt>
    <tag5>
        <addresses/>
        <identifiedBaseServices/>
        <sharedGroups>
            <names/>
            <types/>
        </sharedGroups>
    </tag5>
    <contain>
        <attributes/>
        <addresses/>
        <identifiedBaseServices/>
        <sharedGroups>
            <names/>
            <types/>
        </sharedGroups>
    </contain>
    <smth>
        <tag1/>
        <tag3> TEXT </tag3>
    </smth>
</rt>

并产生此输出:

<?xml version="1.0" encoding="UTF-8"?>
<rt>
   <contain>
      <attributes/>
   </contain>
   <smth>
      <tag3> TEXT </tag3>
   </smth>
</rt>