需要使用XSL删除空格元素值

时间:2017-08-08 09:50:08

标签: xml xslt xslt-2.0

我有两种类型的XML元素,一种是

第一个XML:

<Body>
<h1>aaa</h1>
<h1>bbb</h1>
<h1>ccc</h1>
</Body>

第二个XML:

<Body>
<h1> </h1>
<h1>aaa</h1>
<h1>bbb</h1>
</Body>

XSL我正在使用

<xsl:strip-space elements="h1"/>

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

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

   <xsl:template match="h1"/>

输出我正确地获得第一个XML,如:

<Body>
<h1>aaa bbb ccc</h1>
</Body>

但即使我使用strip-space元素作为第二个xml的h1,我也会如下所示:

<Body>
<h1> aaa bbb</h1>
</Body>

预期输出如

<Body>
<h1>aaa bbb</h1>
</Body>

我需要删除h1的空格元素。但由于该标签,它甚至结合了空间。我使用了优先级,并在模板中也使用了单独的h1 [normalize-space()]标记。但它不起作用。有任何办法可以避免这种情况。请建议。我使用的是XSLT 2.0和saxon-PE 9.6.0.7。提前致谢

2 个答案:

答案 0 :(得分:1)

我认为使用<h1><xsl:value-of select="h1[normalize-space()]"/></h1>代替<h1><xsl:value-of select="h1"/></h1>应该是一个简单的解决方法。

答案 1 :(得分:0)

  

需要删除h1的空格元素。

您看到的空格是第一个h1元素中的空格。它是第一个h1中的空字符串与第二个"aaa"元素中的h1字符串之间的分隔符。您可以通过执行以下操作来验证这一点:

<xsl:template match="Body">
      <xsl:copy>
         <h1><xsl:value-of select="h1" separator="-"/></h1>
      </xsl:copy>
 </xsl:template>

演示:http://xsltransform.net/pNmBy1v

要删除多余的空格,您可以排除空的h1元素(正如我写这篇文章时Martin Honnen所建议的那样),或者将normalize-space()应用于结果。