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

M3m*_*h1z 1 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

谢谢

Mic*_*Kay 5

在XSLT中,从一个复制未更改内容的标识模板开始:

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

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

"我想删除所有细节节点"

那会是

<xsl:template match="Detail"/>
Run Code Online (Sandbox Code Playgroud)

在您修改的问题中:

如果属性为空或0,我想删除所有细节线,例如,如果Detail textbox198 =""

变成了

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

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

使用相同的"空"定义,即可

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