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。

4

2 回答 2

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 A
txt X
txt Y
txt B

请注意标准 XPath 函数normalize-space()的使用,它去除所有前导和尾随空格,并仅用一个空格替换每个其他空格序列。

于 2008-11-28T07:50:23.597 回答
0

你可能想要

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

在这里解释。这篇文章有更多的细节。

于 2008-11-28T00:31:32.967 回答