1

完成转换后,我正在尝试删除所有空元素,但是我只是不正确。我有以下 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>
4

1 回答 1

2

我会稍微重写您的 XSLT 以根据元素的属性record值以不同的方式匹配元素。@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>
于 2013-10-22T12:14:16.803 回答