【问题标题】:Using XSLT to remove empty/unwanted nodes使用 XSLT 删除空/不需要的节点
【发布时间】:2013-10-28 16:36:28
【问题描述】:

我有一个 XML 文件,其中包含许多我想使用 XSLT 清理的不需要/不需要的数据

这是带有示例空节点的数据的小sn-p

<?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,但我的知识有限。

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

谢谢

【问题讨论】:

    标签: xml xslt xpath


    【解决方案1】:

    在 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)]])]"/>
    

    【讨论】:

    • 嗨迈克尔,对不起,我的含糊不清,我已经更新了 OP。如果属性为空或 0,我想删除所有详细信息行,例如如果 Detail textbox198="",那么我想删除它。
    • 我已编辑答案以回答更改后的问题。 (顺便说一句,我讨厌做的事情)。
    • 嗨迈克尔,感谢更新的解决方案,我遗漏了重要信息的错误。我这样做是否正确?我正在添加一个 XSL 标头,使用您的第一个代码 sn-p,然后使用您的第三个代码 sn-p 应用第二个模板,但我的输出仍然有“空”的详细信息行,如上面的示例(没有错误)。我也尝试在第一个模板的开头使用没有关闭标签的第三个 sn-p 但这也不起作用。我做错了什么?
    • 我需要查看完整的样式表。
    • 这是我目前所拥有的(有没有办法在 cmets 部分进行格式化?w3.org/1999/XSL/Transform"> 我还尝试将第三个 sn-p 添加为第二个模板并按原样使用您的第一个 sn-p。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2011-03-08
    • 1970-01-01
    • 2018-12-18
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多