【问题标题】:XSLT: Remove Empty Nodes ~AND~ Nodes with Literal Value "Null"XSLT:删除空节点 ~AND~ 具有字面值“Null”的节点
【发布时间】:2018-11-21 03:19:14
【问题描述】:

全部,

我一直在使用这篇文章最底部的非常基本的样式表来从 XML 记录中删除空元素节点。 XSLT 充分地完成了这项工作,但 XML 记录实际上在样式表未删除的某些元素中包含文字“空”值。示例:

<marc:datafield tag="400" ind1="1" ind2=" ">
   <marc:subfield code="a">null</marc:subfield>
   <marc:subfield code="q">null</marc:subfield>
   <marc:subfield code="d"></marc:subfield>
</marc:datafield>

在运行 XSLT 之前,我一直在使用查找和替换手动删除这些“空值”,这是一个运行良好的过程 - 但让 XSLT 本身删除这些值以及任何其他值会更明智空节点。换句话说,我想去掉包含“null”的节点

<marc:subfield code="q">null</marc:subfield>

AND 类似的节点

<marc:subfield code="q"></marc:subfield>

因此,此消息中顶部示例中表示的整个节点块完全消失。

下面的 XSLT 成功地删除了具有文字“null”值的节点,但它保留了空节点。我需要 XSLT 同时做这两件事:删除文字“空”值和包含它们的节点以及空节点。我试过做一个“否则选择”条件,但它不起作用。

<xsl:strip-space elements="*"/>
<xsl:template match="*[not(node())]"/>    
<xsl:template match="node()|@*">
    <xsl:if test="(. != '') and (. != 'null')">
    <xsl:copy>
        <xsl:apply-templates select="node()[normalize-space()]|@*"/>
    </xsl:copy>
    </xsl:if>    
</xsl:template>

您能提供的任何帮助将不胜感激。

问候,非常感谢--

Sed V.

原始 XSLT:

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" media-type="text/xml"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*[not(node())]"/>    
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()[normalize-space()]|@*"/>
    </xsl:copy>
</xsl:template>

【问题讨论】:

    标签: xslt


    【解决方案1】:

    你快到了。你的模板

    <xsl:template match="*[not(node())]"/>
    

    过滤空元素 - 只需将 or text() = 'null' 添加到谓词即可过滤包含文字 null 字符串的元素。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:strip-space elements="*"/>
    
        <!-- Identity transform -->
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <!-- Filter empty elements or elements that contain the text 'null' -->
        <xsl:template match="*[not(node()) or text() = 'null']"/>
    </xsl:stylesheet>
    

    【讨论】:

    • 谢谢,谢谢。这非常有帮助。下面的公式最终完成了我需要的操作。它包括您提供的至关重要的、不可或缺的部分。
    • w3.org/1999/XSL/Transform"> 复制>
    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多