使用XSLT删除空/不需要的节点

时间:2013-10-28 16:36:28

标签: xml xslt xpath

我有一个包含大量不需要/不需要的数据的XML文件,我想用XSLT清理它

以下是带有示例空节点

的小数据片段
<?xml version="1.0" encoding="utf-8"?>
<Report xsi:schemaLocation="xxx">
    <Tablix3>
        <Tablix13 Textbox1164="TAX SUMMARY" Textbox10="">
            <table26 textbox155="code">
                <Detail_Collection>
                    <Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
                    <Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
                    <Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
                    <Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
                    <Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
                    <Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
                    <Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
                    <Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
                    <Detail textbox198="" TaxText2="" textbox112="0" textbox114="0" textbox200="0" textbox202="0" textbox874="0" />
                </Detail_Collection>
            </table26>
            <Tablix26>
                <table24>
                    <Detail_Collection>
                        <Detail textbox208="" textbox209="" textbox210="0" />
                        <Detail textbox208="" textbox209="" textbox210="0" />
                        <Detail textbox208="" textbox209="" textbox210="0" />
                        <Detail textbox208="" textbox209="" textbox210="0" />
                        <Detail textbox208="" textbox209="" textbox210="0" />
                        <Detail textbox208="" textbox209="" textbox210="0" />
                        <Detail textbox208="" textbox209="" textbox210="0" />
                        <Detail textbox208="" textbox209="" textbox210="0" />
                        <Detail textbox208="" textbox209="" textbox210="0" />
                        <Detail textbox208="" textbox209="" textbox210="0" />
                    </Detail_Collection>
                </table24>
            </Tablix26>
        </Tablix13>
    </Tablix3>
</Report>

我想删除例如所有空(在属性中没有值或值为0)的详细信息节点,并且只有当所有细节行都为空时,还要删除详细信息收集节点。

我想保留这些表,因为它偶尔会有我需要的属性数据。

我尝试过使用Xpath但是我的知识有限。

有人可以指出我正确的方向吗?

由于

1 个答案:

答案 0 :(得分:5)

在XSLT中,从身份模板开始,复制未更改的内容:

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

然后为要删除的节点添加空模板规则。

  

“我想删除所有详细信息节点”

那将是

<xsl:template match="Detail"/>

在修订后的问题中:

  

如果属性为空或0,我想删除所有细节线,例如如果详细信息textbox198 =“”

成为

<xsl:template match="Detail[@*[not(. = '' or . = 0)]]"/>
  

“并且只有当所有细节线都为空时,还要删除详细信息收集节点。”

使用相同的“空”定义,即

<xsl:template match="Detail_Collection[not(Detail[@*[not(. = '' or . = 0)]])]"/>