全部
在这篇文章的最底部,我一直在使用极其基本的样式表来从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>
答案 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>