2016-03-01 12 views
0

我的输入XML是如下删除在XML空的子元素,使用XSLT

<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 shoule像,

<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,所有这一切都空值移除的元素。但是我只需要删除子元素。

+1

等都不是代码写作服务。我们很乐意帮助您解决您遇到的任何问题,但您必须向我们展示您迄今为止的尝试。 – Matthew

+1

@Mthethew对不起,我同意。我没有追加我在第一篇文章中尝试过的XSLT。我现在用我的XSLT更新了这篇文章。请查看 – Rajthilak

回答

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

+0

谢谢。它工作正常! – Rajthilak

0

我尝试以下方法和工作:

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

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