XSLT:删除空节点〜AND〜字面值为“ Null”的节点

时间:2018-11-20 18:43:45

标签: xslt

全部

在这篇文章的最底部,我一直在使用极其基本的样式表来从XML记录中删除空元素节点。 XSLT可以很好地完成这项工作,但是XML记录实际上在样式表不会删除的某些元素中包括文字“ null”值。示例:

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

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

AND节点

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

,以便使此消息中最上面示例中代表的整个节点块完全消失。

紧接下方的XSLT成功删除了具有字面值为“ null”值的节点,但是将空节点保留在原处。我需要XSLT同时执行这两项操作:删除文字“ null”值以及包含它们的节点以及空节点。我已经尝试过执行“其他选择”条件,但是它不起作用。

<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>

1 个答案:

答案 0 :(得分:0)

您快到了。您的模板

<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>