2014-09-11 31 views
0

輸入XML:如何使用for-each循環在xslt中從輸出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中。 我正在使用for-each循環在我的xslt中。我得做什麼才能得到沒有空標籤的輸出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> 

+0

向我們展示您的XSLT。 – 2014-09-11 09:39:50

回答

1

這是不刪除空元素的問題,而是它是關於沒有在第一添加它們地點。解決方案是使用「推」的方法,而不是「拉」的方法。

替換此:

<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> 

這是一個通用的方法,將在所有文本節點規範化空間沒有與其他模板匹配。

+1

一個非常好的例子說明爲什麼基於規則的處理在處理半結構化數據方面比在剛性程序處理方面更好。 – 2014-09-11 10:58:09

+0

在那裏我有正如我所說的,添加應用模板和模板匹配在我的XSL代碼 – Anitha 2014-09-12 07:26:34

+0

@Anitha,與'適用-templates'線替換所有的代碼在您的文章。只有一個地方可以將'templates'放在XSLT中,它直接位於'xsl:stylesheet'根元素的內部。無論您將其添加到什麼訂單中都沒有關係。 – JLRishe 2014-09-12 07:39:03