使用XSLT删除XML中的空子元素

时间:2016-03-01 11:11:00

标签: xml xslt xml-parsing xslt-1.0 xslt-3.0

我的输入XML如下,

<OUTPUT-AREA><TIME-CD>A</TIME-CD>
    <ID-G>
        <Table-ID-T>
            <AT-ID-T>YYYX</AT-ID-T>
            <AT-ID-T/>
            <AT-ID-T/>
        </Table-ID-T>
    </ID-G>
</OUTPUT-AREA>

我的输出XML应该像,

<OUTPUT-AREA>
    <TIME-CD>A</TIME-CD>
    <ID-G>
        <Table-ID-T>
            <AT-ID-T>YYYX</AT-ID-T>
        </Table-ID-T>
    </ID-G>
</OUTPUT-AREA>

我想只删除具有空值的子元素。在上面的示例中,我只想删除具有空值的<AT-ID-T>元素 但不应删除Table-ID-T或ID-G。

这里的一个挑战是,假设所有子元素都有空值,那么至少应该有一个子元素 保留在表格或数组中。

例如,输入XML是

<OUTPUT-AREA>
    <TIME-CD>A</TIME-CD>
    <ID-G>
        <Table-ID-T>
            <AT-ID-T/>
            <AT-ID-T/>
            <AT-ID-T/>
        </Table-ID-T>
    </ID-G>
</OUTPUT-AREA>

然后输出应该像,

<OUTPUT-AREA>
    <TIME-CD>A</TIME-CD>
    <ID-G>
        <Table-ID-T>
            <AT-ID-T/>
        </Table-ID-T>
    </ID-G>
</OUTPUT-AREA>

请提供符合要求的合适XSLT。

请在下面找到我尝试过的XSLT,

   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://ACORD.org/Standards/Life/2">
    <xsl:output encoding="UTF-8" indent="no" omit-xml-declaration="no"/>
   <xsl:template match="/">
    <xsl:apply-templates select="*"/>
   </xsl:template>
   <xsl:template match="*">
    <xsl:if test=".!=''">
       <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:apply-templates/>
       </xsl:copy>
    </xsl:if>
   </xsl:template>

在XSLT上面应用时,删除了所有具有空值的元素。但我只需删除子元素。

2 个答案:

答案 0 :(得分:0)

假设您知道要删除的空元素的名称(例如AT-ID-T),请使用

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Table-ID-T[not(AT-ID-T[normalize-space()])]/AT-ID-T[position() > 1] 
                         | Table-ID-T[AT-ID-T[normalize-space()]]/AT-ID-T[not(normalize-space())]"/>

</xsl:transform>

一个输入样本在http://xsltransform.net/ej9EGcX联机,另一个输入样本为http://xsltransform.net/ej9EGcX/2

答案 1 :(得分:0)

我尝试了以下方式及其工作方式:

<xsl:template match="node()[.='']"/>

<xsl:template match="Table-ID-T/*[1]">
   <xsl:copy-of select="."/>
</xsl:template>