XSLT - 转换后删除空标记

时间:2013-10-22 12:01:33

标签: xslt

我正在尝试在完成转换后删除所有空元素,但我只是不对。 我有以下XML

<root>
  <record name='1'>
    <Child1>value1</Child1>
    <Child2>value2</Child2>
  </record>
  <record name='2'>
    <Child1>value1</Child1>
    <Child2>value2</Child2>
  </record>
  <record name='3'>
    <Child1>value1</Child1>
    <Child2>value2</Child2>
  </record>
</root>

我希望输出为

<root>
  <record name="1">
    <Element>1</Element>
  </record>
</root>

然而,我仍然不断获取所有空记录元素,我无法弄清楚如何摆脱它们。

<root>
  <record>
    <Element>1</Element>
  </record>
  <record/>
  <record/>
</root>

这是我的样式表

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <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="//record">
    <xsl:copy>
      <xsl:call-template name="SimpleNode"/>    
    </xsl:copy>
  </xsl:template>

  <xsl:template name="SimpleNode">
    <xsl:if test="@name = '1'">
      <Element><xsl:value-of select="@name"/></Element>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:2)

根据record属性的值,我会稍微重写您的XSLT以匹配@name个元素。

以下XSLT样式表:

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

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

  <!-- Only produce output for record elements where the name attribute is 1. -->
  <xsl:template match="record[@name='1']">
    <xsl:copy>
      <element>
        <xsl:value-of select="@name"/>
      </element>
    </xsl:copy>
  </xsl:template>

  <!-- For every other record attribute, output nothing. -->
  <xsl:template match="record"/>
</xsl:stylesheet>

在应用于示例输入XML时生成以下输出:

<root>
  <record>
    <element>1</element>
  </record>
</root>