【问题标题】:How do i remove all linebreaks?如何删除所有换行符?
【发布时间】:2010-09-24 09:36:40
【问题描述】:

我有这样的事情:

<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 输入是 &lt;node&gt;-tags。

【问题讨论】:

    标签: xslt newline line-breaks


    【解决方案1】:

    以下变换:

    <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() 的使用,该函数去除所有前导和尾随空格,并仅用一个空格替换所有其他空格序列。

    【讨论】:

      【解决方案2】:

      你可能想要

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

      解释了here。而这个article 有更多的细节。

      【讨论】:

      • 指令仅适用于 whitespace-only text 节点,绝对不适用于属性。因此这个答案是不正确的。
      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2019-09-28
      相关资源
      最近更新 更多