【问题标题】:Remove empty child elements in XML using XSLT使用 XSLT 删除 XML 中的空子元素
【发布时间】:2016-06-13 18:39:15
【问题描述】:

我的输入 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>

我只想删除具有空值的子元素。在上面的示例中,我只想删除具有空值的 &lt;AT-ID-T&gt; 元素。
但不应删除 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 时,删除所有具有空值的元素。但我只需要删除子元素。

【问题讨论】:

  • SO 不是代码编写服务。我们很乐意帮助您解决您遇到的任何问题,但您必须向我们展示您迄今为止所做的尝试。
  • @Matthew 对不起,我同意。我没有附加我在最初的帖子中尝试过的 XSLT。我现在已经用我的 XSLT 更新了这篇文章。请查看

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


【解决方案1】:

我尝试了以下方法及其工作原理:

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

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

【讨论】:

    【解决方案2】:

    假设您知道要删除的空元素的名称(例如 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 用于另一个输入样本。

    【讨论】:

      猜你喜欢
      • 2018-05-12
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 2010-12-26
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多