XSLT:删除特定节点下的空元素

时间:2012-11-12 12:58:49

标签: xslt

输入

 <person>
    <address>
       <city>NY</city>
       <state></state>
       <country>US</country>
    </address>
    <other>
       <gender></gender>
       <age>22</age>
       <weight/>
    </other>
 </person>

我只想从“其他”节点中删除空元素,“其他”下的标记也不固定。

输出

<person>
    <address>
       <city>NY</city>
       <state></state>
       <country>US</country>
    </address>
    <other>
       <age>22</age>
    </other>
 </person>

我是xslt的新手所以请帮助..

2 个答案:

答案 0 :(得分:4)

此转化:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="other/*[not(node())]"/>
</xsl:stylesheet>

应用于提供的XML文档时:

<person>
    <address>
        <city>NY</city>
        <state></state>
        <country>US</country>
    </address>
    <other>
        <gender></gender>
        <age>22</age>
        <weight/>
    </other>
</person>

会产生想要的正确结果:

<person>
   <address>
      <city>NY</city>
      <state/>
      <country>US</country>
   </address>
   <other>
      <age>22</age>
   </other>
</person>

<强>解释

  1. identity rule 按“原样”复制每个匹配的节点,并为其选择执行。

  2. 覆盖标识模板的唯一模板匹配other子元素且没有子节点(为空)的任何元素。由于此模板没有正文,因此可以有效地“删除”匹配的元素。

答案 1 :(得分:1)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>
    <xsl:template match="/">
        <xsl:apply-templates select="person"/>
    </xsl:template>
    <xsl:template match="person">
        <person>
            <xsl:copy-of select="address"/>
            <xsl:apply-templates select="other"/>
        </person>
    </xsl:template>
    <xsl:template match="other">
        <xsl:for-each select="child::*">
            <xsl:if test=".!=''">
                <xsl:copy-of select="."/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>