2008-11-27 140 views
14

我有這樣的事情:如何刪除所有換行符?

<node TEXT=" txt A "/> 
<node TEXT=" 

     txt X 

"/> 
<node> 
    <html> 
     <p> 
     txt Y 
     </p> 
    </html> 
</node> 
<node TEXT="txt B"/> 

,我想使用XSLT來得到這樣的:

txt A 
txt X 
txt Y 
txt B 

我想去除所有無用的空格和@ TEXT的和CDATA的換行符的。輸出結構唯一的XML輸入是<node> -tags。

回答

18

以下變換:

 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:template match="*"> 
    <xsl:apply-templates select="@TEXT | node()"/> 
</xsl:template> 

<xsl:template match="node/@TEXT | text()"> 
    <xsl:if test="normalize-space(.)"> 
    <xsl:value-of select= 
    "concat(normalize-space(.), '&#xA;')"/> 
    </xsl:if> 

    <xsl:apply-templates /> 
</xsl:template> 
 
</xsl:stylesheet> 

當針對這個XML文檔

 
<t> 
    <node TEXT=" txt A "/> 
    <node TEXT="  txt X"/> 
    <node> 
     <html> 
      <p>  txt Y  </p> 
     </html> 
    </node> 
    <node TEXT="txt B"/> 
</t>

施加產生所想要的結果:

TXT - 答
TXT X
TXTŸ
TXT乙

請注意使用標準的XPath功能normalize-space(),它去掉了所有開頭和結尾的空格和其他替代空間的每個序列只用一個空間。

1

您可能希望

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

解釋here,而這article有更多的細節。

+0

指令僅適用於* whitespace-only * * text *節點,絕對不適用於屬性。所以這個答案是不正確的。 – 2008-11-28 07:33:30