如何使用xslt中的for-each循环从输出xml中删除空标记?

时间:2014-09-11 09:23:51

标签: xml xslt-2.0

输入xml:

<sb:pages>

   <sb:first-page>

     461

   </sb:first-page>

   <sb:last-page>

     70

   </sb:last-page>

</sb:pages> 

<sb:pages>

   <sb:first-page>

     461

  </sb:first-page>

</sb:pages> 

我的输出xml:

<sb:pages>

   <sb:first-page>461</sb:first-page>

   <sb:last-page>70</sb:last-page>

</sb:pages> 

<sb:pages>

   <sb:first-page>461</sb:first-page>

   <sb:last-page/>

</sb:pages> 

我不想要我的输出xml中的第二页。因为sb:pages [last()] / sb:last-page不在我的输入xml中。 我在我的xslt中使用for-each循环。我需要做什么来获得没有空标记的输出xml?

我的预期输出xml是:

<sb:pages>

   <sb:first-page>461</sb:first-page>

   <sb:last-page>70</sb:last-page>

</sb:pages> 

<sb:pages>

   <sb:first-page>461</sb:first-page>

</sb:pages> 

有谁帮我解决了这个问题?

我的xslt是:

  <xsl:for-each select="/pages/sb:pages"/>

     <sb:first-page><xsl:value-of select="normalize-space(sb:first-page)"/> 

      </sb:first-page>

     <sb:last-page><xsl:value-of select="normalize-space(sb:last-page)"/>

      </sb:last-page>

 </xsl:for-each>

1 个答案:

答案 0 :(得分:1)

这不是删除空元素的问题,而是关于不首先添加它们的问题。解决方案是使用&#34; push&#34;接近而不是&#34;拉&#34;做法。

替换它:

 <xsl:for-each select="/pages/sb:pages"/>

     <sb:first-page><xsl:value-of select="normalize-space(sb:first-page)"/> 

      </sb:first-page>

     <sb:last-page><xsl:value-of select="normalize-space(sb:last-page)"/>

      </sb:last-page>

 </xsl:for-each>

有了这个:

 <xsl:apply-templates select="/pages/sb:pages" />

并添加以下模板:

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

<xsl:template match="*[not(*)]/text()">
  <xsl:value-of select="normalize-space()" />
</xsl:template>

这是一种通用方法,可以规范所有文本节点中与其他模板不匹配的空间。