我有一个包含大量不需要/不需要的数据的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但是我的知识有限。
有人可以指出我正确的方向吗?
由于
答案 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)]])]"/>